对 *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"。这是为什么?

对此事有什么想法吗?

*为便于阅读而编辑

修改targetsource指针没问题,但是你需要用原来的指针调用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++; 
  }

}

现在,尽管您正在更改 targetsource,但您打印出的值将始终从原始指针开始,因此可以安全地进行迭代。这应该允许您更改主函数以像这样调用 copyArrays

copyArray(target, source, 5);

自从 运行 关于

的恐龙以来,我就再也没有使用过 c++。

但是我认为行: *target++ = *source++; 不是按照你的想法去做。
我认为正在发生的事情是 *source++ 将一些未知的(下一个顺序内存地址)读取为整数值。

copyArray(int &target, int &source, int size)