将整个数组传递给一个函数

前端之家收集整理的这篇文章主要介绍了将整个数组传递给一个函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我们将一个数组的元素传递给一个函数时,它被视为普通变量,被调用函数创建一个实际参数的副本并对其进行操作.在形式论证中做出的任何改变都不会影响实际的论据.

但是,当我们通过一个数组时,情况并非如此.在这种情况下(称为函数)可以访问实际的参数,并且形式参数中所做的任何更改会影响实际的参数.为什么会发生这种情况?

解决方法

数组作为指针传递给元素.

如果我写:

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方法将起作用.

猜你在找的C&C++相关文章