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

将整个数组传递给一个函数,第1张

概述当我们将一个数组的元素传递给一个函数时,它被视为普通变量,被调用函数创建一个实际参数的副本并对其进行 *** 作.在形式论证中做出的任何改变都不会影响实际的论据. 但是,当我们通过一个数组时,情况并非如此.在这种情况下(称为函数)可以访问实际的参数,并且形式参数中所做的任何更改会影响实际的参数.为什么会发生这种情况? 数组作为指针传递给元素. 如果我写: void doStuff(int *ptr){ 当我们将一个数组的元素传递给一个函数时,它被视为普通变量,被调用函数创建一个实际参数的副本并对其进行 *** 作.在形式论证中做出的任何改变都不会影响实际的论据.

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

解决方法 数组作为指针传递给元素.

如果我写:

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

总结

以上是内存溢出为你收集整理的将整个数组传递给一个函数全部内容,希望文章能够帮你解决将整个数组传递给一个函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1249189.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存