1.指针的含义
内存单元的编号叫做地址(Address),也称为指针(Pointer)。
- 1 内存单元的指针和内存单元的内容是两个不同的概念,从下图可以理解:
2. 一个指针是一个地址,是一个常量。而一个指针变量可以被赋予不同的指针值,是变量。
现在我们用C++语言在深入了解一下指针和地址的关系
#include <iostream>
using namespace std;
int main(){
int a = 3;
int b = 12;
int* c;
c = &a;
int** d;
d = &c;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
cout << *c << endl;
cout << **d << endl;
cout << *d << endl; //&a
cout << &*d << endl; //&c
cout << **&d << endl; //&a
}
2.1 先梳理一下代码的流程,定义一个两个int类型的变量并初始化,定义一个一级指针和一个二级指针并初始化,最后就是指针的使用。如下图所示:
2.1.1 所有的常量都存在常量池中,内存中保存的的常量池中常量的地址,c内存单元放的是a的地址,d内存单元放的是c的地址。
2.2.1 首先我们需要知道a、b、c、d的地址,方便我们后面对比图,假设上面图中的地址就是a、b、c、d的地址。
~那*c和**d就是指取地址里面的内容,所以*c指向0x133,0x133找变量a并且打印a的值3;*d先指向0x135,x135找变量c,**d就减了一个指针等于*c,*c又指向0x133,0x133找变量a并且打印a的值3。如下图:(**d是黑线,*c是红线)
~那&*d和**&d,&*d------&c-------打印c的地址;**&d------**0x136--*0x135--0x133;在这里千万不要把*d和&d看成是同一个地址,*d是0x135,&d是0x136。如下图:(&*d是黄色的线,**&d是蓝色的线)