这个问题涉及到函数的传参问题,有两种方式:值传递和地址传递,地址就是指针嘛。
这两者的区别是:值传递是将实参的值传递给形参变量,形参变量值的任何改变不会影响到实参值;地址传递,就是把变量在内存空间的地址传递给形参,这时对应形参必定是一个指针变量,那么这个指针变量就指向了该实参变量,那么通过指针变量改变了其所指向的内存空间的值实际上就是改变了实参值。
还有就是全局变量和局部变量的作用域和生存期问题。全局变量是存在在内存区的静态区的,局部变量是存放在栈区的。
int x,y,z; //程序开头定义了全局变量x,y,z,默认初始化值是0,这是编译系统自动设置的初始值,当全局变量和局部变量同名时,在局部变量的作用域下同名的全局变量失效,即被屏蔽掉了,不起作用了。
初始化全局变量x=5,y=2,z=0;
p(&x,y); //将变量x的地址赋值给指针变量x,变量y的值赋值给y,前者是地址传递,后者是值传递
--*x; //通过指针运算符使指针x指向的变量x的值自减1,所以main()函数中的x=4了
y++; //形参y是局部变量,它的值是2,全部变量y此时在p()函数中被屏蔽了,局部变量y的值变成了3。
z=*x+y; //即z=4+3=7,所以全局变量z=7
//p()函数执行完后,返回到main()函数,此时x=4,实参y的值没有变化还是2,全局变量z的值变为7了。
所以第一个输出的结果是:4,2,7#
p(&y,x); //指针x指向了全局变量y了,那么*x的值就是全局变量y的值2,形参y=4
--*x; //*x自减1,亦即就是使全局变量y的值自减1,所以全局变量y=1了,但是p函数的局部变量y此时等于4
y++; //局部变量y的值自增1,就变为5了
z=*x+y; //z=1+5=6
//所以返回main()函数后,全局变量x=4没变,y=1了,z=6了,所以输出值为:4,1,6
综上分析,最终的输出结果就是:4,2,7#4,1,6