求大神详细解答这道题的执行过程,一定要把变量存储类别的相关知识通过这道题讲得详细!谢谢!
1个回答
展开全部
首先,我们看第一个调用函数,f(a, &c);,这时候 a = 2, c = 4,注意 c 传进去的时候是一个地址,改变的话是改变地址里面的值,然后进入这个调用函数 f ,b + =a ++, 可以等价于 b = b + a; a ++ ; 也就是执行完这句话之后应该是 b = 10 + 2 = 12, a 自加1 等于3, c += a+ b同理 c= c+ a + b=35, 再 之后的*x = 35 + 2=37,到这里函数执行结束,记住,传进来的形参,如果不是地址,即便是修改了这个变量,函数执行结束后还是会释放掉,不会保存,也就是说 即便 a 自加1变成了3,但是因为传进来的只是一个值而非地址,所以a的值不变,还是2,但是 c传进来的是他的地址(*x),改变地址中的值也就是改变了他的值,所以第一个printf函数打印的是 2, 37; 也就是说这句话执行结束后 a= 2, c =37;
往下, 第二个调用函数 f(3 + c, &a), 进入调用函数,也就是在调用函数中 a = 40, *x = 2, 注意看,变量c是一个static静态变量,所以上一次函数结束后是不会释放的,在这个作用域中c 的值还是35,再经过 b+ =a ++; c +=a+b(方法和上述一样)之后,c的值变为126, *x = 128;而*x是指向a的地址,改变了a地址中的值,所以在函数执行结束后a = 128,c的值同理,因为不是地址,所以不管在函数里面经过什么样的变化,他的值依然和刚刚传进来的时候一样,还是37,所以最后打印 a = 128.c = 37
不明白的继续追问我
往下, 第二个调用函数 f(3 + c, &a), 进入调用函数,也就是在调用函数中 a = 40, *x = 2, 注意看,变量c是一个static静态变量,所以上一次函数结束后是不会释放的,在这个作用域中c 的值还是35,再经过 b+ =a ++; c +=a+b(方法和上述一样)之后,c的值变为126, *x = 128;而*x是指向a的地址,改变了a地址中的值,所以在函数执行结束后a = 128,c的值同理,因为不是地址,所以不管在函数里面经过什么样的变化,他的值依然和刚刚传进来的时候一样,还是37,所以最后打印 a = 128.c = 37
不明白的继续追问我
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询