我正在学习一本名为C++ 无所畏惧的教科书(我是自学的,仍处于初学者阶段)。我完全被指针一章中的一个练习难住了。这是练习的确切措辞:
"编写并测试一个
copy_array
将一个int
数组的内容复制到另一个相同大小的数组的函数。该函数应采用两个指针参数。循环内部的操作应如下所示:*p1 = *p2; p1++; p2++;
我能够在没有错误的情况下构建我的程序(哇),但我的问题是,当我在调用copy_array
函数后将第二个数组打印到屏幕上时,结果是第二个数组的原始元素。我相信我的问题出在我的copy_array
职能上。我花了过去 2 个小时在互联网上搜索类似的练习及其解决方案,但仍然被难住了。我确实看到了另一个与我的类似的 Stack Overflow 问题,似乎该解决方案与创建要逐步执行的指针副本有关,因此 2 个指针的位置不会改变或类似的东西......我尽我最大的努力去理解和想象如何做到这一点,但我仍然被难住了。啊。对这个问题的任何帮助将不胜感激!
#include <iostream>
using namespace std;
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
void copy_array(int* p1, int* p2, int n)
{
while (n-- > 0)
{
*p1 = *p2;
p1++;
p2++;
}
}
int main()
{
cout << "Contents of Array 1 before..." << endl;
for (int i = 0; i < 10; i++)
{
cout << arr1[i] << " " << endl;
}
cout << "Contents of Array 2 before..." << endl;
for (int i = 0; i < 10; i++)
{
cout << arr2[i] << " " << endl;
}
copy_array(arr1, arr2, 10);
cout << "Contents of Array 2 after..." << endl;
for (int i = 0; i < 10; i++)
{
cout << arr2[i] << " " << endl;
}
return 0;
}
线路:
*p1 = *p2;
*p1 “取消引用” p1 指针,这意味着分配给 this 的任何内容都将分配给 p1 指示的地址。
*p2 “取消引用” p2 指针,对该位置的任何读取都将读取存储在 p2 指示的地址处的值。
p1++;
这将地址指针增加 1,这并不意味着 1 个字节,这意味着存储在 p1 中的大小增加 1,在这种情况下它是一个 int,所以它通过 sizeof(int) 增加地址。
p2++; // Does the same as p1++.
因此,在这种情况下,您分配给 p1 数组,而不是分配给 p2 数组。
*p1 = *p2;
意思是:将地址p2中存储的值复制到地址p1中。p1 是变化的内存。
虽然不是完全类型安全的 memcpy 有一些手动功能可能没有的优点。memcpy 最终会生成几乎最佳的代码,它真的很棒。我希望我已经正确解释了您的问题, memcpy 需要指针。
template <typename T>
bool safe_copy(T * dest, size_t dest_count, const T * source, size_t source_count)
{
auto const dest_bytes = sizeof(dest[0]) * dest_count;
auto const source_bytes = sizeof(source[0]) * source_count;
//
//
if (dest_bytes < source_bytes) return false;
//
//
return memcpy( (void*)dest, (const void *)source, sizeof(source[0]) * source_count ) == dest;
}
请不要因为本文列出的原因禁止使用 memcpy 的供应商:https : //docs.microsoft.com/en-us/previous-versions/bb288454(v=msdn.10)
通常建议使用 memcpy_s 代替,但这并不总是可用。
您可以在此处查看我提出的解决方案:https : //onlinegdb.com/HJlybSLVH
编辑:正如下面的评论中所讨论的,标准的 C++ 方法正在使用
std::copy
std::copy_n
std::copy_if
std::copy_backward
std::reverse_copy
std::replace_copy
std::replace_copy_if
std::unique_copy
一个很好的资源在这里:
https://en.cppreference.com/w/cpp/header/algorithm
这些实现了同样的事情,但被推广到迭代器的概念。因为您询问了指针,所以我发布了关于仅处理指针的 memcpy。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句