对 *target++ = *source++ 的工作非常困惑
very confused on the working of *target++ = *source++
所以,我已经完成了阅读,并且理解了 *p++ 的含义,以及 *target++ = *source++ 工作原理的基础知识。但是我对得到的结果感到非常困惑。
我想将一个数组的内容复制到另一个数组中。很简单,除非你看看数组的内容如何随着程序的变化而变化 运行,我不知道为什么这是输出...
这是我的程序:
#include <stdio.h>
void printArray(int *array, int size){
printf("{ ");
for (int i = 0; i < size; ++i)
printf("%d, ", array[i]);
printf("}");
printf("\n");
}
void copyArray(int *target, int *source, int size){
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(source, 5);
printf("Target Array: ");
printArray(target, 5);
printf("\n");
*target++ = *source++;
}
}
int main(void){
int source[] = {1, 2, 3, 4, 5};
int target[5] = {0};
copyArray(target, source, 11);
return 0;
}
这是我的输出 运行s:
迭代#1
源数组:{ 1, 2, 3, 4, 5, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代#2
源数组:{ 2, 3, 4, 5, 32767, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代#3
源数组:{ 3, 4, 5, 32767, -732409276, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代 #4
源数组:{ 4, 5, 32767, -732409276, 1442845569, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代 #5
源数组:{ 5, 32767, -732409276, 1442845569, 1583093720, }
目标数组:{ 0, 0, 0, 0, 1, }
迭代 #6
源数组:{ 32767, -732409276, 1442845569, 1583093720, 32767, }
目标数组:{ 0, 0, 0, 1, 2, }
迭代#7
源数组:{ -732409276, 1442845569, 1583093720, 32767, -1844984375, }
目标数组:{ 0, 0, 1, 2, 3, }
迭代#8
源数组:{ 1442845569, 1583093720, 32767, -1844984375, 32767, }
目标数组:{ 0, 1, 2, 3, 4, }
迭代#9
源数组:{ 1583093720, 32767, -1844984375, 32767, -1844984375, }
目标数组:{ 1, 2, 3, 4, 5, }
所以我有几个直接的问题是:
1) 当我调用函数时,我将其传递给它 "target",它是指向数组第一个元素的指针。为什么我的目标数组从最后一个位置开始填充?
2) 我那里没有任何代码,至少没有任何自愿代码可以修改我的 "source" 数组的值。为什么会发生变化?
3) 我的这个程序的第一个版本使用了一个指向 source 的最后一个元素的指针来停止 copyArray 内的循环,但是当 运行ning gdb 我注意到它需要更多的迭代来 return 函数比数组中的元素多,我很好奇。通过反复试验,我发现 copyArray() 中的循环需要 9 次迭代才能将 "source" 完全复制到 "target"。这是为什么?
对此事有什么想法吗?
*为便于阅读而编辑
修改target
和source
指针没问题,但是你需要用原来的指针调用printArray
,而不是移动的指针。否则,在第一次迭代之后,您打印的不是索引 0..4,而是 1..5,然后是 2..6,然后是 3..7...这些都具有未定义的值,在这种特殊情况下,您最终在尝试打印 source
时将 运行 变成 target
(在迭代 5 之后)。
你需要做这样的事情:
int* source_original = source;
int* target_original = target;
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(source_original, 5);
printf("Target Array: ");
printArray(target_original, 5);
printf("\n");
*target++ = *source++;
}
void copyArray(int *target, int *source, int size){
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(source, 5);
printf("Target Array: ");
printArray(target, 5);
printf("\n");
*target++ = *source++;
}
}
你不能这样做。您不断更改目标和源指向的位置,然后从这个新值开始打印。这就像在一条只有 5 栋房屋然后是悬崖的街道上读取房屋的数字。当你读到 5 时,你正在读完最后一个房子,然后走下悬崖再读 4 个数字。
你的目标数组看起来正确的唯一原因可能是因为值被复制到堆栈上。试试这个。
void copyArray(int *target, int *source, int size){
int * originalTarget = target, int * originalSource = source;
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(originalSource, 5);
printf("Target Array: ");
printArray(originalTarget, 5);
printf("\n");
*target++ = *source++;
}
}
现在,尽管您正在更改 target
和 source
,但您打印出的值将始终从原始指针开始,因此可以安全地进行迭代。这应该允许您更改主函数以像这样调用 copyArrays
copyArray(target, source, 5);
自从 运行 关于
的恐龙以来,我就再也没有使用过 c++。
但是我认为行:
*target++ = *source++
;
不是按照你的想法去做。
我认为正在发生的事情是 *source++ 将一些未知的(下一个顺序内存地址)读取为整数值。
copyArray(int &target, int &source, int size)
所以,我已经完成了阅读,并且理解了 *p++ 的含义,以及 *target++ = *source++ 工作原理的基础知识。但是我对得到的结果感到非常困惑。
我想将一个数组的内容复制到另一个数组中。很简单,除非你看看数组的内容如何随着程序的变化而变化 运行,我不知道为什么这是输出...
这是我的程序:
#include <stdio.h>
void printArray(int *array, int size){
printf("{ ");
for (int i = 0; i < size; ++i)
printf("%d, ", array[i]);
printf("}");
printf("\n");
}
void copyArray(int *target, int *source, int size){
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(source, 5);
printf("Target Array: ");
printArray(target, 5);
printf("\n");
*target++ = *source++;
}
}
int main(void){
int source[] = {1, 2, 3, 4, 5};
int target[5] = {0};
copyArray(target, source, 11);
return 0;
}
这是我的输出 运行s:
迭代#1
源数组:{ 1, 2, 3, 4, 5, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代#2
源数组:{ 2, 3, 4, 5, 32767, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代#3
源数组:{ 3, 4, 5, 32767, -732409276, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代 #4
源数组:{ 4, 5, 32767, -732409276, 1442845569, }
目标数组:{ 0, 0, 0, 0, 0, }
迭代 #5
源数组:{ 5, 32767, -732409276, 1442845569, 1583093720, }
目标数组:{ 0, 0, 0, 0, 1, }
迭代 #6
源数组:{ 32767, -732409276, 1442845569, 1583093720, 32767, }
目标数组:{ 0, 0, 0, 1, 2, }
迭代#7
源数组:{ -732409276, 1442845569, 1583093720, 32767, -1844984375, }
目标数组:{ 0, 0, 1, 2, 3, }
迭代#8
源数组:{ 1442845569, 1583093720, 32767, -1844984375, 32767, }
目标数组:{ 0, 1, 2, 3, 4, }
迭代#9
源数组:{ 1583093720, 32767, -1844984375, 32767, -1844984375, }
目标数组:{ 1, 2, 3, 4, 5, }
所以我有几个直接的问题是: 1) 当我调用函数时,我将其传递给它 "target",它是指向数组第一个元素的指针。为什么我的目标数组从最后一个位置开始填充?
2) 我那里没有任何代码,至少没有任何自愿代码可以修改我的 "source" 数组的值。为什么会发生变化?
3) 我的这个程序的第一个版本使用了一个指向 source 的最后一个元素的指针来停止 copyArray 内的循环,但是当 运行ning gdb 我注意到它需要更多的迭代来 return 函数比数组中的元素多,我很好奇。通过反复试验,我发现 copyArray() 中的循环需要 9 次迭代才能将 "source" 完全复制到 "target"。这是为什么?
对此事有什么想法吗?
*为便于阅读而编辑
修改target
和source
指针没问题,但是你需要用原来的指针调用printArray
,而不是移动的指针。否则,在第一次迭代之后,您打印的不是索引 0..4,而是 1..5,然后是 2..6,然后是 3..7...这些都具有未定义的值,在这种特殊情况下,您最终在尝试打印 source
时将 运行 变成 target
(在迭代 5 之后)。
你需要做这样的事情:
int* source_original = source;
int* target_original = target;
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(source_original, 5);
printf("Target Array: ");
printArray(target_original, 5);
printf("\n");
*target++ = *source++;
}
void copyArray(int *target, int *source, int size){
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(source, 5);
printf("Target Array: ");
printArray(target, 5);
printf("\n");
*target++ = *source++;
}
}
你不能这样做。您不断更改目标和源指向的位置,然后从这个新值开始打印。这就像在一条只有 5 栋房屋然后是悬崖的街道上读取房屋的数字。当你读到 5 时,你正在读完最后一个房子,然后走下悬崖再读 4 个数字。
你的目标数组看起来正确的唯一原因可能是因为值被复制到堆栈上。试试这个。
void copyArray(int *target, int *source, int size){
int * originalTarget = target, int * originalSource = source;
for (int i = 0; i < size; ++i)
{
printf("Iteration #%d \n",i+1 );
printf("Source Array: ");
printArray(originalSource, 5);
printf("Target Array: ");
printArray(originalTarget, 5);
printf("\n");
*target++ = *source++;
}
}
现在,尽管您正在更改 target
和 source
,但您打印出的值将始终从原始指针开始,因此可以安全地进行迭代。这应该允许您更改主函数以像这样调用 copyArrays
copyArray(target, source, 5);
自从 运行 关于
的恐龙以来,我就再也没有使用过 c++。但是我认为行:
*target++ = *source++
;
不是按照你的想法去做。
我认为正在发生的事情是 *source++ 将一些未知的(下一个顺序内存地址)读取为整数值。
copyArray(int &target, int &source, int size)