社区
C语言
帖子详情
关于实参和形参中数据传递的单向"值传递"问题?
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(晨星) 好强!
62.函数的
形参
和
实参
.pdf
在计算机编程
中
,函数的参数起...函数的
形参
和
实参
是编程
中
函数调用和
数据
传递
的基础概念。
形参
和
实参
虽然紧密相关,但是它们在内存
中
是相互独立的。正确理解和运用这两个概念,对于编写高效、健壮的程序代码至关重要。
深入分析C语言
中
函数参数
传递
.pdf
C语言
中
有三种方式可以进行
数据
传递
:①实际参数(简称
实参
)和形式参数(简称
形参
)之间进行的
数据
传递
;②被调用函数通过return语句,将函数值返回到主调函数
中
;③通过全局变量进行
数据
传递
(这会破坏函数的独立...
采用图示分析法剖析C语言函数参数
传递
规律.pdf
本文的图示分析法通过在图示
中
区分主调函数和被调函数的局部变量区域,并使用水平和垂直虚线来表示函数调用的时机,以及
实参
和
形参
值的变化过程,为理解参数
传递
提供了直观的辅助。通过这种方法,开发者能够更清晰地...
C++
形参
与
实参
的区别实例解析
4. **
数据
传递
方向**:
数据
是从
实参
传向
形参
,这是
单向
的。在函数执行期间,
形参
的改变不会影响到
实参
的值。例如,`Exchg1`函数
中
的
形参
`x`和`y`的改变不会影响到
实参
`a`和`b`。 让我们分析一下提供的代码示例: -...
C++
单向
按
值
传递
(产生临时对象) 双向按引用
传递
(不产生临时对象不占任何内存).rar
在C++编程语言
中
,参数
传递
是一个至关重要的概念,它涉及到函数调用时
实参
到
形参
的
数据
传输方式。本资料主要探讨了两种常见的参数
传递
方式:按
值
传递
(pass by value)和按引用
传递
(pass by reference)。下面将...
C语言
70,012
社区成员
243,257
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章