C语言中用数组做为形参为什么形参改变时实参也要变??

如题所述

c语言中数组名作为实参传给被调用的函数时,形参获得的是数组的起始地址。
还是用例子说话吧。
#include

int
*arry(int
*a)
{
int
*b;
b
=
a;
int
i;
for(i=0;i<5;i++)
{
printf("%d",a[i]);
}
return
b;
}
int
main()
{
int
a[5]
=
{1,2,3,4,5};
int
*c;
int
i;
c
=
arry(a);
for(i=0;i<5;i++)
{
printf("%d",c[i]);
}
}
主要是通过指针把数组,例如main里面的a的地址传入arry函数,然后在arry函数中用一个兼容类型的指针接收地址,然后就可以再这个指针下的地址操作地址上面的数据了。
arry返回的时候也是返回一个指针(地址)。
温馨提示:内容为网友见解,仅供参考
第1个回答  2020-03-24
因为数组传递的是数组的首地址,所以也是地址传递,所以形参改变时实参也要变。本回答被提问者采纳

当用数组名作形参时,形参数组改变可使实参数组随之改变 . 这句话哪 ...
用数组名作形参,传进去的实参必然是数组名或指向该数组名的指针,在子函数中改变的数组就是以传过去的那个数组名为首址的同一个数组,子函数中改变的数组也就是这同一个数组,还能分什么形参数组和实参数组吗?如果说这句话有错的话,那就是根本就没有“形参数组”和“实参数组”之分,本来就只有...

在c语言中怎样使形参值改变实参值也跟着改变
在C里面 是无法做到形参改变 实参值同步改变的。只能通过传地址的方式 即参数类型为指针 这样 形参指向空间修改,可以使得实参指向空间同步修改,因为是同一块内存区域。另外,在C++中,可以通过引用传参,来实现你说的目的。

C语言调用函数时什么情况下通过形参实参会发生改变?
形参和实参如果都是地址(即指针)时,会发生改变形参即可改变实参的情况,因为这时形参和实参实际上是对应同一段内存的数据。

C中函数调用,数组的形参和实参与变量的实参和形参有什么不同
1,你开始学的是值传递,即形参把实参的值复制过去,他们根本上是两个不一样的变量,只是值相同而已,所以对形参的任何操作不影响实参。2,数组名是数组首元素的地址,这是指针传递,把数组的地址传了过去,自定义函数拿到地址对数组进行操作,将影响这个数组。(注意这里没有复制,而是间接访问数组本身)

c语言函数的形参与实参的问题?
首先要理解一点,数组在做参数传递的过程中会损失数组的长度信息,退化成一个指针 例如你形参写成(char s[10]),或者干脆(char s[]),函数只能接收到一个char 所以:char dp[n][m]的类型本质上是数组的指针,即char (*)[m],它是指向长度为m的char数组的指针 char **是char *的指针,指针是...

为什么说对行参的任何修改,都不会影响实参?
函数实参与形参之间的数据传递方式是( 值传递)传递方式,在C语言中,数据传递方式有值传递和引用传递,值传递:传值,实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。引用传递: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,...

C语言实参和形参的关系
探讨C语言实参与形参的关系,解答初学者常见疑惑。原文提出问题,引发思考。深入解析实参与形参的关系,以下要点揭示其本质。1. 实参与形参地址不同。实参是函数调用时传入的变量,形参是函数内部的参数,两者地址独立。2. 非指针参数函数中,实参传递值至形参,形参使用实参值,实参地址保持不变。3. 指针...

c语言怎么将数组作为函数参数传入?
一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,从而形参是改变不影响实参 数组名代表着整个数组的地址,如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组和实参数组完全相同,是存放在同一存储空间的同一个数组。这样形参数组 修改时...

形参形参和实参的关系
在传值调用中,形参与实参的值是分离的,形参的改变不会影响实参。例如,在C语言的示例中,主函数中的n值为100,即使在函数s中形参n的值变为5050,主函数输出的n值仍为100,表明实参n的值没有变化。然而,当使用引用调用或引用传递(如C#中的ref关键字)时,形参实际上是实参的引用,形参的改变会...

c语言。用指针做实参、形参为什么会出现在被调函数中数组成功修改但主调...
copy_ptrs传参错了。看你这个函数是用尾元素地址的当前元素地址差值作为循环条件的。所以你这里形参变量rce表示的是最后一个元素的地址。所以实参应该是source+A-1。你写的是source+A造成循环数组越界了。另外,你main最后的打印用i做下标,但没给i赋值。要加一个for。下图加粗的就是改动的地方。

相似回答