通过传送地址值,直接在被调用函数中直接改变实参。是怎么改变的?

2025-01-07 05:08:31
推荐回答(3个)
回答1:

确实是只能单向传递(在C语言),不矛盾。

如果直接传值(void swap(int a,int b)),那么无论在函数里如何修改这个值,都修改的是函数里那个变量的值,不会影响外面。

如果传地址(void swap(int*a,int*b)),那么函数拿到这个地址就可以修改这个内存地址中的数据,退出函数后原来变量的内存地址中的数据就改变了。


所以,swap函数里的变量值无论如何都传递不到主函数的,传址的时候是通过地址修改了主函数里的数据。


附图1,传值为什么改不了


附图2,传址为什么能改

回答2:

swap是典型的解释指针用法的教科书例子。。。

如果不用指针,则swap函数的作用仅限于函数内。。。swap(int a,int b)中的a,b的作用域只在函数内,在函数外部是看不到的,a=x,b=y时,传递的是x,y的值,a,b的值改变了,但x,y的值没有变,而函数返回只能返回一个对象,不能同时返回两个对象,也无法把改变后的a,b同时赋值回给x,y。所以在这里是无法实现函数功能的。。。

而swap(int* a,int* b)中a是指针变量,记录的是一个内存地址,a=&x的意思是取x变量的内存地址给a,这样a和&x是同一个地址,*a和x是同一个实际内容的两个名字。。。操作*a就等于操作了x。。。

呃,通俗点的解释就是:
值传递等于克隆,再造了一个和你一模一样的人,但是把那个人怎么操作,对你本身也没影响。。。
指针传递等于给你取了一个新名字,把这个新名字代表的人进行操作,实际就是对你本身进行操作。。。

回答3:

关键是传指针或者引用,还是传值,前三个就不说了,不管传指针还是引用,都是这个结果,关键是(4)的输出,因为你传的是指针,所以,在函数内部,变量的值变了,在函数外部有效,如果你去掉*指针标志,估计就还是输出x=30,y=20