当我们将一个数组的元素传递给一个函数时,它被视为普通变量,被调用函数创建一个实际参数的副本并对其进行操作.在形式论证中做出的任何改变都不会影响实际的论据.
但是,当我们通过一个数组时,情况并非如此.在这种情况下(称为函数)可以访问实际的参数,并且形式参数中所做的任何更改会影响实际的参数.为什么会发生这种情况?
解决方法
数组作为指针传递给元素.
如果我写:
void doStuff(int *ptr) { ptr[1] = 5; } int main() { int arr[] = {0,1,2}; doStuff(arr); printf("%d %d %d\n",arr[0],arr[1],arr[2]); }
输出为“0 5 2”.这是因为C通过值实际上是参数的值.该参数是指向int的指针.所以指向int的指针通过值传递.因此,doStuff在主堆栈帧中获取指向内存的指针的副本.当它用ptr [1]取消引用指针时,它跟随指向main的内存的指针,并在那里修改数组.
C只能通过价值,但它会这样“浅”.如果你要求它传递一个int *,它将传递一个int *.它只复制指针的值,而不是其指向的任何值.
如果你想让doStuff获得自己的数组副本,可以像其他人一样建立一个结构体,或者使用memcpy来手动深入复制数组:
void doStuff(int *ptr,int nElems) { int myCopyOfTheArray[nElems]; memcpy(myCopyOfTheArray,ptr,sizeof(int) * nElems); /* do stuff with the local copy */ }
与使用结构体不同,如果nElems仅在运行时才知道,则memcpy方法将起作用.