指针,一级指针,二级指针
我们知道指针分为一级指针,二级指针…n级指针,其中一级指针指向其类型的对象,二级指针指向一级指针,以此类推n级指针指向n-1级指针,需要注意的是,上一级指针指向下一级指针,上一级指针的类型要保持和其指向下一级指针的类型相同(void类型指针除外),在本文中假定其类型都相同。
指针的地址,指针指向对象的地址
我们知道,指针存放的内容是地址,那存放的是谁的地址呢,存放的是其指向对象的地址,那指针的地址又是什么呢,我们知道每个对象都有其本身的地址,指针也是一种对象,所以它也有地址。那这二者有什么区别呢,我们知道指针指向某个对象,也就是存储了某个对象的地址,也就是把指向这个对象的地址存储在了指针本身的地址空间里面,也就是俗称的地址里面存储了地址。
如下图
int val = 1;
int *ptr = &val;
cout<<&val<<endl;
cout<<ptr<<endl;
cout<<*ptr<<endl;
cout<<&ptr<<endl;
输出结果为
我们可以看到,我们定义了一个int变量val,定义了一个int类型的指针ptr指向val,我们第一行输出表示变量val本身的地址,第二行输出表示p存储空间里面的数据,也就是val的地址,所以这两个输出相同,第三行使用了解引用符*,表示的是指针ptr指向对象所存储的值,也就是1,第四行表示指针本身的地址。
我们接下来讨论二级指针与这些地址的关系,看懂了下面的关系,再往后的指针也就是类似了,相信大家会对这些地址的关系会有一个非常清晰的认知
同样的我们二级指针是指向一级指针,那么我们二级指针存储的就是一级指针的地址,我们在上图的基础下做如下定义和输出。
再提一句,例如上图中,我们指针的名字是ptr,而不是ptr,所以我们想要输出指针存储的数据时候,我们输出的是ptr,而不是ptr.当我们输出*ptr时,*表示解引用符,表示输出其指向对象的值。
int val = 1;
int *ptr = &val;
int **ptr1 = &ptr;
cout<<&val<<endl;
cout<<&ptr<<endl;
cout<<&ptr1<<endl;
cout<<ptr1<<endl;
cout<<*ptr1<<endl;
cout<<**ptr1<<endl;
输出
其中1,2,3行输出的分别是val,ptr,ptr1的地址,我们知道ptr1存储的是ptr的地址,所以第4行输出的是ptr的地址,而*ptr1,对ptr1进行了一次解引用,那么输出的是ptr1指向对象存储的内容,也就是ptr存储的内容,也就是val的地址,所以第五行输出的是val的地址,而**ptr1进行了2次解引用,那么输出的是其指向的对象指向的对象的值,也就是ptr指向对象的值,也就是val的值。
关于指针的一些基础知识,大家清楚了吗