理解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
反思
- 指针是个地址,指向哪里这个概念是人为的,便于理解搞出来的。
- int******** p = xx;p就是个指针,存储 int******(少一个*)的类型的数据,这个数据是个地址。
- ***p,这个是计算题,首先p要代表一个地址,*才能找这个地址中存储的值。
- 还有个套娃问题,int a = 10;&a有值,&&a有值,&&a有值,到底是本来就有值,还是因为加了&,才生成的一个对应的地址。
想明白了,本身a是有地址的。 &a是赋值给了某个指针。所以指针是被创造出来的。所以指针也有地址了。指针是存储地址的特殊变量。