指向指针的指针pp指向指针p

13 篇文章 0 订阅

向初学者菜鸟讲解什么是“指向指针的指针”并不轻松。本着**少逼逼,给我看代码(Talk is cheap, Show me the code)**的原则,海洋饼干叔叔直接以一个完整示例开头,来试试。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

如果一个指针指向一个int类型的对象,那么该指针的类型为int*。如果一个指针指向的对象不是一个平凡的对象,而是另外一个指针,那么这个指针就成为“指向指针的指针”。请见下述C语言示例:

//Project - Pointer2Pointer
#include <stdio.h>

int main(){
    int a = 100;
    int *p = &a;
    int **pp = &p;

    printf("&a = %p, p = %p\n", &a, p);   //p的值为a的地址
    printf("&p = %p, pp = %p\n", &p, pp); //pp的值为p的地址
    printf("&pp = %p\n", &pp);
    printf("before: a = %d, *p = %d, **pp = %d\n", a, *p, **pp);

    a++;
    (*p)++;
    **pp = **pp + 1;

    printf("after: a = %d, *p = %d, **pp = %d\n", a, *p, **pp);
    return 0;
}

上述程序的执行结果为:

&a = 000000000061FE1C, p = 000000000061FE1C
&p = 000000000061FE10, pp = 000000000061FE10
&pp = 000000000061FE08
before: a = 100, *p = 100, **pp = 100
after: a = 103, *p = 103, **pp = 103

说明:在读者的计算机上,执行结果前3行中的地址很可能与本书不同。

🚩第5 ~ 7行:定义了三个变量a、p以及pp。根据程序的输出值,我们画出了下述示意图。
图1 a、p及pp之间的关系
从图1中可以看出,a、p、pp都是变量,只是类型各不相同,它们都有自己的存储地址和空间。p是指向a的指针,p的值即为a的地址;pp则是指向p的指针,pp的值即为p的地址。

🚩第9行:输出a的地址及p的值,从执行结果的第1行可见,p值即为a的地址,指针p指向a。

🚩第10行:输出p的地址及pp的值,从执行结果的第2行可见,pp的值即为p的地址,指向指针的指针pp指向指针p。

🚩第11行:输出pp的地址。从执行结果的第3行可见,pp也是一个对象,拥有自己的内存及地址。

🚩第12行:输出a,*p以及**pp的值。pp是一个指向指针的指针,pp即为p,**pp等价于p,即为a。执行结果的第4行可见,三种途径都输出了相同的值,即a的值100。

🚩第14 ~ 16行:通过a、*p以及**pp三种方式修改a的值,执行完后,a值预期应为103。

🚩第18行:再次输出a、*p以及**pp的值。执行结果的第5行可见,三种途径都事实上输出了a值,为103。

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
Python编程基础及应用
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值