大一c语言题目,形参实参与指针的问题

为什么两个运行结果不同。
2024-12-03 22:07:52
推荐回答(4个)
回答1:

首先理解值传递和地址传递的区别。

第二个程序就是值传递。实参a的值传给形参x,实参b的值传给形参y。这里的x与a只是值相等了,但是两个不同的内存单元。好比一班和二班两位同学,只是名字都叫张三,却是两个不同的人。同理,b和y也类似于一班和二班另两位同学,只是名字都叫李四,却是不同的两人。在swap函数中,只是对x和y操作,类似于只是二班的张三和李四发生了点变化。他们的变化是不会影响一班的张三和李四的。所以x和y的变化不会影响a和b。因为这是四个不同的内存单元。

第一个程序是地址传递。实参&a(a的地址)传给形参x,实参&b(b的地址)传给形参y。这样的话,x就指向了a,y也指向了b。代码中temp=*x;就等价于temp=a;了。 同理,*x=*y; 等价于a=b; *y=temp;等价于b=temp; 。这里对*x和*y操作,实际上就是对a和b的操作。所以会影响a和b的值。

回答2:

函数形参一定要传递地址,调用过程中改变形参的值,不会影响实参变量本身,实参变量保持值不变,下面的写法输出的形参值不会改变。上面写法形参值改变实参。

回答3:

C语言使用的是值传递,仅仅将实参的值传递给形参。

对于第一种写法
main函数传递给Swap函数的是&a和&b的值,即a和b所在的地址的值
那么Swap函数里面通过*x来更改的就是&a所在的地址里面的值,也就是a本身的值了,所以第一种写法main函数调用Swap函数之后,a和b的值会发生互换。

对于第二种写法
main函数传递给Swap函数的是a和b的值,即只是将15和8传递给了Swap函数
那么Swap函数里面更改15和8,和main函数的a和b没有啥关系的,所以第二种写法main函数调用Swap函数之后,a和b的值不会发生互换。Swap函数只是更改了x和y的值,对a和b没有什么影响

这就是C语言参数的值传递的奇妙之处了。

回答4:

第二个交换了x和y,对a和b没有影响,因为形参和实参的内存地址是不一样的
第一个交换了a和b的地址所指向的内容,所以交换有效