在复习数据结构,创建单链表以及做链表的一些基本操作的时候,遇到需要使用二重指针的情况,刚开机的大脑对于这个东西已经十分混乱了,于是做了一个小test来理解二重指针的相关概念。
测试代码如下:
#include <stdio.h>
int main(){
int a = 5;
int *pa = &a;
int **ppa = &pa;
int *pb = &pa;
printf("%d\n",a);
printf("%d\n",pa);
printf("%d\n",ppa);
printf("%d\n",*pa);
printf("%d\n",**ppa);
printf("%d\n",*pb);
return 0;
}
测结果如下:
简单说一下:声明了4个变量,那么其中pa,pb是一重指针变量,ppa是二重指针变量。
对于指针,我们关注四方面的内容:指针的类型、指针所指向的类型、指针的值(指针指向的内存区)、指针本身所占据的内存区(指针的地址)。
由于对二重指针的使用并不是很深入,我只是做一个简单的小test加以理解二重指针的概念,这里对于指针的类型和指针所指向的类型的区分并没有做详细的说明,但是其实这是两个概念,是精通指针的关键点之一,感兴趣的朋友可以自己去看一些其他也许解释的更深刻的博文,或者自己做一个更细致的test。
- 指针的类型:
int * pa --> int *
int ** ppa --> int ** - 指针所指向的类型:
int * pa --> int
int ** ppa --> int *
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待 - 指针的值:
pa–>6487564
ppa–>6487552
pb–>6487552 - 指针本身所占据的内存区
指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在 32 位平台里,指针本身占据了 4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
理解:
①变量储存值
②指针变量的值:指针变量本身存储的数值。如输出的pa,ppa
③指针:变量的值是一个地址,这个地址指向另一个内存区。
④运算符:&和*
&:取地址符
*:间接运算符 *p–>p所指向的东西
说白了,指针变量装的是地址,二重指针装的就是指针。
pa=另一个指针 改变了pa所指向的区域,pa指向了新的区域
*pa= xxx 改变了pa所指向的区域的值
ppa=另一个二重指针 改变了ppa所指向的区域,这些区域存放的值依然是地址值
*ppa=另一个地址 改变了一重指针的指向区域,也就是说,ppa的值不变,改变了ppa存放的指针的指向。
在我的使用场景里也就是单链表有关的相关操作,声明了一个指针型的变量LinkList L,这个时候这个L指向一个未知的区域,在初始化操作InitList中,让L指向NULL,意味着这是一个空表。
那么要想在函数InitList中改变L的指向(指针变量L的值),我们要传入L的地址,函数InitList接受这个实参的形参就需要是一个二重指针(存放指针L的地址),之后做*L=另一个地址。
仅供参考。