形参的改变无法影响到实参,是我开始以为的。后来发现用指针变量可以改变实参。
#include <stdio.h>
#include<stdlib.h>
void fun(int *a,int *b)
{
int *c;
c=a;
a=b;
b=c;
}
void fun1(int *a,int *b)
{
int *c;
*c=*a;
*a=*b;
*b=*c;
}
int main()
{
int x=3, y=5, *p=&x, *q=&y,*k=&x,*z=&y;
fun(p,q); printf("%d,%d\n",*p,*q);
fun1(k,z);printf("%d,%d\n",*k,*z);
// fun(&x,&y); printf("%d,%d\n",*p,*q);
return 0;
}
这段代码 输出 3,5 3,3;
首先我认为,在main()中,p,q获得了整形x,y的地址。进入fun()函数后,a,b,c交换的a,b的地址应该p,q的地址也要变化,因此我错误的认为输出5,3
至于进入fun1()函数后,是指针变量的值互换应该不会改变我错误的认为应该输出3,5.请您帮我指导下,详细点。否则我可能不懂。谢谢您
func 由于是形参,虽然a跟b的数值调换了(a,b是int *类型也就是你说的地址(地址也是值)),但是不是引用传递,所以对p,q没有任何影响。
func1 你的int *c都没初始化就赋值*c=*a;确定能跑通?
func1 更改的是*a 和 *b的数值(*a指的是取a地址的内容,也就是说把a地址的内容和b地址的内容交换了,内存层面的操作全局都是有效的),所以最后输出结果5,3
你的输出结果3,3是怎么打印的?主要你的程序没初始化指针肯定抛异常啊
举个例子内存里有4个值,A1->B1,A2->B2,A3->B3,A4->B4其中A是地址B是值,B1=A3,B2=A4也就是说A1和A2存的是A3,A4的指针,A1,A2,A3,A4分别对应你程序的p, q, x, y变量
进入func,p传递给a,A5->B1, q传递给b,A6->B2
func就是在函数局部交换了a,b的值对应我的例子就是A5->B2,A6->B1交互B1和B2的值,但是func函数退出局部变量销毁A5,A6,剩下A1->B1,A2->B2,A3->B3,A4->B4
进入func,p传递给a,A5->B1, q传递给b,A6->B2
交换a,b的内容(*a 就是取a地址的内容对应例子A5->B1=A3->B3取出来的是B3), 交换后A5->B1=A3->B4, A6->B2=A4->B3,直接看A3和A4内存结构变为A3->B4和A4->B3
退出局部变量销毁A5,A6,剩下A1->B1,A2->B2,A3->B4,A4->B3