C语言指针那块地题目,有点乱,不知道调用函数之后带回来的到底是什么?谁能系统的分析下,一步步的,画

2025-04-17 00:05:55
推荐回答(1个)
回答1:

如果想要透彻理解的话,得先澄清一下C语言的“左值”和“右值”的区别:

  • 左值:赋值运算符左边的表达式,必需是可以求得其存储位置的量,可以是个变量名,或者是个表达式,但必需要能找得到表达式所代表的量的内存位置,比如x,array[i],*p,*(p+i),等等。注意&x并不是一个有效的左值,它虽然求出了一个储存位置,但这里的这个代表储存位置的量,它本身并不存在于任何一个固定的储存位置内,而只是一个临时的量(比如可能会被放在寄存器里),因此不能作为左值出现。其实只要考虑一下,赋值就是把右边的值赋给左边的值所在的地址,显然&&x并不可能求得&x的地址,那么&x也就不能作为左值使用。

  • 右值:赋值运算符右边的表达式,就是个普通的值,可以是变量的值,表达式的值,等等。

第一题见图,第二题比较乱,画图太麻烦,下面用文字解释:

  1. 首先k=3,p指向k,调用sp(p)把p(也就是k的地址)传递给了函数sp,这时函数sp的形参a就被赋予了k的地址。

  2. 函数sp的局部变量初始化b=2,形参a则被重新赋值为局部变量b的地址(&b)。

  3. 语句*a=*a*2进行了一次赋值。左值*a求得b,代表向b的位置赋值。右值*a * 2求得b再乘以2。最后将右值赋给左值,所以这句相当于b=b*2。

所以这时*a等于b等于4,由于C语言是传值调用,函数内修改指针a本身的值并不会影响到指针p指向的地址,因此输出4,3,3。