关于实参和形参中数据传递的单向"值传递"问题?

78815 2003-11-19 10:10:49
我看了几遍书,这个问题还是有点糊涂,是不是这样理解:
实参向形参传递值,无论形参如何改变,实参的值是不变的。
如果不对,到底该怎么理解?
...全文
811 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2003-11-19
  • 打赏
  • 举报
回复
别糊涂,首先对于数组的情况,通常只有实参才可以是数组名,而形参都是指针。数组在作为参数传入函数时,就是把数组的首地址赋给了相应的实参指针。数组名代表一个地址,这一点没问题吧?

其次,这个时候,发生参数传递的是“地址”,而这个地址的确是无法在函数内改变的(或者说函数内的改变不影响实参),至于这两个地址是否指向了同一段内存,修改其中一个指向的内容是否会影响另一个指向的内容,我想这个和“值传递”的概念并不矛盾吧?
因为“值传递”只是保证实参本身不被改变,而并不保证实参指向的内容也不被改变。

举例来说,对于数组
int a[10];
来说,“值传递”机制确保:
f(a);
执行后,a的位置不变,即数组a仍然保存在原来那个位置上,但并不保证a[0], a[1]等都不变。

你可以认为这是指针变量和普通变量的一点区别。因为指针变量本来就有间接操纵其它变量的能力。
Meyer 2003-11-19
  • 打赏
  • 举报
回复
C/C++
你不可能by value传递数组

arfi 2003-11-19
  • 打赏
  • 举报
回复
这时候传入的是一个地址值

--------
| | 0xfdc0 //假设这是数组起始地址
--------
| |
--------
| |
--------
| ... |

你的函数void f(int p[]);
在调用此函数时,传入一个地址值,形参p本身也占用内存,其中存储着数组起始地址的值
----------
| 0xfdc0 | 0xffc8 //假设这是形参p,0xffc8是其本身的地址值。
----------
这样你就可以通过指针中存储的数组首地址来访问数组中的元素了
78815 2003-11-19
  • 打赏
  • 举报
回复
有个问题糊涂了,形参和实参数组,它们共用一段内存,那形参和实参也是共用一段内存的吗??如果不是,那么它是占用哪一个空间?形参数组又是占用的哪一个空间?和实参以及实参数组占用的空间又有什么不同??
yonyon 2003-11-19
  • 打赏
  • 举报
回复
对的,两种情况:
1.普通变量:将值传递,形参的变化不影响实参
2.指针变量:虽然指针地址的值随形参变化,但是实参的值,即那个地址不变,
变得是地址里的值
oopig 2003-11-19
  • 打赏
  • 举报
回复
因为调用的时候,型参实际上是实参的拷贝,所以无论怎么修改型参,实参的值是不变的。
arfi 2003-11-19
  • 打赏
  • 举报
回复
right
zhangfjj 2003-11-19
  • 打赏
  • 举报
回复
这种说法只是帮助初学者理解,学习了指针后,这种解释就没有什么意义了,反而会引起读者的疑问,如果还不明白,请进入指针那一章的学习吧!
zhangfjj 2003-11-19
  • 打赏
  • 举报
回复
对呀!
“形参数组”,应该说是一个指针变量,它也有存储单元,它是一个指针,指向了实参数组中的元素,在被调函数中可以借助这个指针变量来操作实参数组中的元素;而“不是数组的形参”,当然要有存储单元,用以存放从实参传递过来的数据。二者都将在函数调用结束后释放。给一个例子:
void main()
{
int a[5]={1,2,3,4,5};
void print(int b[],int );
print(a,5);
}
void print(int b[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d",*(b+i));//也可以写作b[i]
printf("\n");
}
*-----*
a[0] * 1 *
*-----*
a[1] * 2 *
*-----*
a[2] * 3 *
*-----*
a[3] * 4 *
*-----*
a[4] * 5 *
*-----*


在被调函数中
    
   *------*
b * &a[0]*
*------*
b[i]等价于*(b+i),不就是对a[i]的操作吗??
所以输出结果是:12345
从形式上讲,把b看成是形参数组,有助于初学者理解,既然“b[i]等价于*(b+i),不就是对a[i]的操作?”,所以也可以说成是两者共享存储空间了


xutaotao 2003-11-19
  • 打赏
  • 举报
回复
其实,他们都开辟了存储单元,只是对于简单变量来说,开辟的存储单元是用来存放值的,而形参数组开辟的单元只是存放了一个地址值(实参数组的首地址),对形参数组的改变将会直接改变实参数组中的值。
78815 2003-11-19
  • 打赏
  • 举报
回复
还是有点不清楚,就是,
实参数组和形参数组共占同一段内存,在函数调用时,形参数组并没有另外开辟新的存储单元,那么不是数组的形参是不是开辟新的存储单元呢,为什么会不同的呢,
zhangfjj 2003-11-19
  • 打赏
  • 举报
回复
有个问题糊涂了,形参和实参数组,它们共用一段内存,那形参和实参也是共用一段内存的吗??如果不是,那么它是占用哪一个空间?形参数组又是占用的哪一个空间?和实参以及实参数组占用的空间又有什么不同??
-----------------
这种说法来自于谭浩强的《C程序设计》,此前并未讲指针,故谭先生用了一种折衷的表述方法,所谓形参数组与实参数组共用内存空间,所以才有这样的结论,在被调函数中对形参数组值的改变反应到实参数组中。这也算是误导了读者吧,不知道大家同意否。
其实,在调用函数时,使用数组名作为函数的参数,数组名是指向数组首元素的地址值,所以在被调函数中貌似形参数组(其中一维数组的长度、二维数组的第一维数。。。都可以省略)就是一个指针,实质上在编译时自动转化为一个指针,
若形参是下面的形式:
   int a[]  ---->int *a
  int a[][4] ----->int (*a)[4],这也是为什么可以省略的原因
既然使得指针指向了实参数组的首元素,在被调函数中就可以利用指针使用间接访问的方式来访问实参数组中的元素,它们不就共用内存空间了吗?而且指针也可以使用下标运算符,
对第i个元素的访问
int a[10],*p=a;
a[i]
*(a+i)
*(p+i)
p[i]
以上四种方式都是一样的,从p[i]来看,就可以看成了“形参数组”了,你说是不是呢?
lfxzm 2003-11-19
  • 打赏
  • 举报
回复
看糊涂拉
ilovedonny 2003-11-19
  • 打赏
  • 举报
回复
TO:steedhorse(晨星) 好强!

70,012

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧