//*pp=>p;问题

来源:7-1 指针基础【摸清本质带你爱上指针】

十三山入秋

2020-12-28

老师您好:
发现您一处错误:
今天看到后面的时候,就指针方面,发现逻辑上有矛盾就又回看,自己研究了一套模型来研究指针。如图:您第十八行(7-1集7:35)有一处错误,算是口误,但是影响挺大的,您说*pp等价于p,这貌似是不对的,应该是※pp这个地址位置,这块内存的名字叫p,或者说,p这块内存的地址是※pp,参考计算机的原理(源自打点计算机)。然后的话,如果可以的话,您能不能以后难的点,能够用模型画图来演示一下啥的,光说而且说的很快的时候,感觉有时候就可能会有问题[/?],小小的建议。我是初学者,如果说的不对还请指正。图片描述

写回答

5回答

bennyhuo

2020-12-29

先上结论:

//img.mukewang.com/szimg/5fea5823098b4f0607650168.jpg

再说下这是为什么。

按照定义,pp 指向了变量 p,因此 pp 里面存的是 p 的地址。

*pp 是取 pp 指向的变量的值,或者说取间接引用,结果就是 p 的值,因此 *pp 等价于 p。


从你的描述,感觉没有明白 `*pp` 这个运算? 这个其实就是从前面的 `*p` 和 a 的关系推出来的:

//img.mukewang.com/szimg/5fea58d40998b80604350194.jpg

0
1
十三山入秋
非常感谢!
2020-12-29
共1条回复

bennyhuo

2020-12-29

有问题欢迎继续探讨哈~也可以加群聊

1
1
十三山入秋
嗯嗯,[/露出热爱技术的微笑]
2020-12-29
共1条回复

bennyhuo

2020-12-29

//img1.sycdn.imooc.com/szimg/5fea9d0009f5645317120463.jpg

我明白你混淆的点了,其实 * 在声明和运算的时候是不同的含义,参见上图的注释。

我这里说 *pp 等价于 p,讲的时候是有个上文的,就是

//img.mukewang.com/szimg/5fea9d470985338912620647.jpg

0
3
十三山入秋
回复
bennyhuo
嗯嗯,好吧
2020-12-29
共3条回复

十三山入秋

提问者

2020-12-29

老师您好:

*p的这个运算,按我图的演绎,是很好理解和推导的。您也可以看一下我画的图。

您的结论是对的,但问题关键不在这里,问题在于int **pp=&p这个表达式的拆分:

之前理解是左边拆成int * 和*pp两部分,现在根据**pp=a这个反推,(int**)应该是一个整体,也就是说关于“指针的指针”这一语义,他是专门有一个描述符(int **)来描述的。如图是演绎过程。或许对于您来说这个(int **是一个整体)太普通,完全没有在意到这一点,?。

如图,关注我标了蓝色五角星的地方。

//img.mukewang.com/szimg/5fea8e600895ad2b13151600.jpg

/**
* 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


0
2
十三山入秋
回复
bennyhuo
哇,老师您是穿越了吗,哈哈哈哈,您一个小时之前发的和我刚刚发的,内容匹配上了,好神奇,哈哈哈 强转的时候,写(int *)100,这个为什么(int *)又可以看成一个整体
2020-12-29
共2条回复

十三山入秋

提问者

2020-12-28

老师:“应该是*pp这个地址位置,这块内存的名字叫p,或者说,p这块内存的地址是*pp

md语法,把*转换成斜体了”

0
0

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程

相似问题