下面程序段的输出结果是3#1#4,求详细解释

下面程序段的输出结果是3#1#4,求详细解释


int x,y=1;
int func( int *x, int y, int *z )
{    
    (*x)++;  y += 2;  *z = *x+y; 
     return y;
 }
void main()
{    
     int z; 
     x = func(&x, y, &z);  
     printf("%d#%d#%d", x, y, z); 
}

原因就是指针参数可以修改指向变量的值,而值参y不行。
对于x,由于并没有初始化,所以函数内 ( * x)++后,x的值按说应该是个不确定的值,没有意义。所以x值主要是看func函数的返回值,会传递给x。返回值为y,而y在函数中增加了2,而传入函数的y是个全局变量,初始值为1,所以返回值是3。由于y使用值参传递,所以函数中的y与全局变量y是不同的变量,函数中修改的是函数内的局部变量y的值,不是全局变量,因此全局变量没有改变,还是1。
对于z的值,有疑问,因为x并没有初始化,所以z的值为*x + y也是不可靠的,但题目的意思可能认为x自动初始化为0,所以( *x)++后x为1,y+=2后y是3,最终z的值是4

  • x = 0, y = 1;
  • func函数传的三个参数,分别是 x的地址,y的副本,z的地址
  • 进入 func函数 (*x)++, x 变为 1; y+=2, y变为 3,注意这是外面y副本的值; *z = *x+ y,z = 1 + 3= 4;函数返回 y,即返回3。
  • 主函数func函数返回,重新赋值x,x = 3; y值不变,y =1;z 传的地址,值改为 4。
  • 最后打印 3#1#4
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^