//*pp=>p;问题
来源:7-1 指针基础【摸清本质带你爱上指针】

十三山入秋
2020-12-28
老师您好:
发现您一处错误:
今天看到后面的时候,就指针方面,发现逻辑上有矛盾就又回看,自己研究了一套模型来研究指针。如图:您第十八行(7-1集7:35)有一处错误,算是口误,但是影响挺大的,您说*pp等价于p,这貌似是不对的,应该是※pp这个地址位置,这块内存的名字叫p,或者说,p这块内存的地址是※pp,参考计算机的原理(源自打点计算机)。然后的话,如果可以的话,您能不能以后难的点,能够用模型画图来演示一下啥的,光说而且说的很快的时候,感觉有时候就可能会有问题[/?],小小的建议。我是初学者,如果说的不对还请指正。
5回答
-
先上结论:
再说下这是为什么。
按照定义,pp 指向了变量 p,因此 pp 里面存的是 p 的地址。
*pp 是取 pp 指向的变量的值,或者说取间接引用,结果就是 p 的值,因此 *pp 等价于 p。
从你的描述,感觉没有明白 `*pp` 这个运算? 这个其实就是从前面的 `*p` 和 a 的关系推出来的:
012020-12-29 -
bennyhuo
2020-12-29
有问题欢迎继续探讨哈~也可以加群聊
112020-12-29 -
bennyhuo
2020-12-29
我明白你混淆的点了,其实 * 在声明和运算的时候是不同的含义,参见上图的注释。
我这里说 *pp 等价于 p,讲的时候是有个上文的,就是
032020-12-29 -
十三山入秋
提问者
2020-12-29
老师您好:
*p的这个运算,按我图的演绎,是很好理解和推导的。您也可以看一下我画的图。
您的结论是对的,但问题关键不在这里,问题在于int **pp=&p这个表达式的拆分:
之前理解是左边拆成int * 和*pp两部分,现在根据**pp=a这个反推,(int**)应该是一个整体,也就是说关于“指针的指针”这一语义,他是专门有一个描述符(int **)来描述的。如图是演绎过程。或许对于您来说这个(int **是一个整体)太普通,完全没有在意到这一点,?。
如图,关注我标了蓝色五角星的地方。
/**
* 7-1 指针基础
*/
#include <stdio.h>
#include <io_utils.h>
int main(void) {
int a = 10;
int *p = &a;//
int **pp = &p;
printf("*p:\t%#x\n", *p);
printf("a:\t%#x\n", a);
printf("p:\t%#x\n", p);
printf("*pp:\t%#x\n", *pp);
printf("**pp:\t%#x\n", **pp);
printf("pp:\t%#x\n", pp);
printf("&p:\t%#x\n", &p);
printf("&a:\t%#x\n", &a);
return 0;
}---------运行结果-----------
*p: 0xa
a: 0xa
p: 0x64fe14
*pp: 0x64fe14
**pp: 0xa
pp: 0x64fe08
&p: 0x64fe08
&a: 0x64fe14
022020-12-29 -
十三山入秋
提问者
2020-12-28
老师:“应该是*pp这个地址位置,这块内存的名字叫p,或者说,p这块内存的地址是*pp
md语法,把*转换成斜体了”
00
相似问题