加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:41:52 所属栏目:百科 来源:网络整理
导读:当我们将一个数组的元素传递给一个函数时,它被视为普通变量,被调用函数创建一个实际参数的副本并对其进行操作.在形式论证中做出的任何改变都不会影响实际的论据. 但是,当我们通过一个数组时,情况并非如此.在这种情况下(称为函数)可以访问实际的参数,并且形式
当我们将一个数组的元素传递给一个函数时,它被视为普通变量,被调用函数创建一个实际参数的副本并对其进行操作.在形式论证中做出的任何改变都不会影响实际的论据.

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

解决方法

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

如果我写:

void doStuff(int *ptr)
{
  ptr[1] = 5;
}

int main()
{
  int arr[] = {0,1,2};
  doStuff(arr);
  printf("%d %d %dn",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方法将起作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读