理解C++指针

理解C++指针

案例代码

#include <iostream>
using namespace std;

int main(){
   int a=10;
   int* p_a=&a;
   int** pp_a=&p_a;
   int*** ppp_a=&pp_a;

   std::cout<< "&a=" << &a << std::endl;         //0x16fdff268
   std::cout<< "p_a=" << p_a << std::endl;       //0x16fdff268
   std::cout<< "&p_a=" << &p_a << std::endl;     //0x16fdff260
   std::cout<< "*p_a=" << *p_a << std::endl;     //10
   std::cout<< "&pp_a=" << &pp_a << std::endl;   //0x16fdff258
   std::cout<< "**pp_a=" << *pp_a << std::endl;   //0x16fdff268
   std::cout<< "&ppp_a=" << &ppp_a << std::endl; //0x16fdff250
   std::cout<< "***ppp_a=" << *ppp_a << std::endl; //0x16fdff260
   
    return 0;
}

指针写法

* int *a
* int* a //推荐,下面用这种,好理解

&和*

&:求变量地址
*:1.申明是指针,2.解析地址对应的值 

公式 *(&a)=a,  
白话文: 计算a这个值对应的地址,然后解析这个地址对应的值
  • int* a ,表示a是个指针,只有 ‘&b’这种表示地址的,才能赋值给a,b的要求是int类型的变量。
    1可以复制给a吗?当然不行,因为1不是地址。

  • int** a,表示a是个指针,只有 ‘&b’这种表示地址的,才能赋值给a,b需要是个int* 类型的指针

  • int*** a,表示a是个指针,只有 ‘&b’这种表示地址的,才能赋值给a,b需要是个int**类型的指针

练习

结合案例代码,***ppp_a 结果是?


综上所述
根据:int*** ppp_a=&pp_a;  int*** 只是申明类型
ppp_a=&pp_a
*ppp_a=*(&pp_a)=pp_a,
根据:int** pp_a=&p_a;
*ppp_a=&p_a
**ppp_a=*(&p_a)=p_a
根据:int* p_a=&a
***ppp_a=*(p_a)=*(&a)=a

因为a=10,所以***ppp_a=10

反思

  1. 指针是个地址,指向哪里这个概念是人为的,便于理解搞出来的。
  2. int******** p = xx;p就是个指针,存储 int******(少一个*)的类型的数据,这个数据是个地址。
  3. ***p,这个是计算题,首先p要代表一个地址,*才能找这个地址中存储的值。
  4. 还有个套娃问题,int a = 10;&a有值,&&a有值,&&a有值,到底是本来就有值,还是因为加了&,才生成的一个对应的地址。

想明白了,本身a是有地址的。 &a是赋值给了某个指针。所以指针是被创造出来的。所以指针也有地址了。指针是存储地址的特殊变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值