指针变量就是一个变量,指针变量有自己的存储空间。指针变量的空间容量是多少?我们可以使用sizeof关键字获取指针变量的容量,程序测试例子如下:
程序运行结果如下:
可以看到,char*、int*、double*类型的指针变量,都是存放一个变量的地址。所以,指针变量的内存空间都是一样,都是占用4个字节。
那么,可以把一个变量的地址,赋给指针变量。例如:
char a;
char* pa = &a; //指针变量pa指向变量a;
此时,pa作为char*类型的指针变量,存放变量a的地址。那么,pa是指针变量,也是一个变量,也有自己的存储空间和内存地址。那么,指针变量pa的地址可以赋给怎么样类型的变量?
此时,我们就引出了二级指针,它的定义如下:
数据类型** 变量名;
就是在数据类型后面,接上两个指针取值运算符“**”,那么,就把变量定义为二级指针。那么,定义指针变量的时候,有N个指针取值运算符,就称为N级指针。例如:
数据类型* 变量名;
此时,定义的就是一级指针变量。可以总结:
(1) 一级指针变量可以存放普通变量的地址;一级指针变量就指向普通变量;
(2) 对一级指针变量使用指针取值运算符*,是对一级指针变量降级,转换为它所指向的变量;
(3) 二级指针变量就是可以存放一级指针变量的地址;二级指针变量就指向一级指针变量;
(4) 对二级指针变量使用指针取值运算符*,是对二级指针变量降级,转换为它所指向的变量;就是转换为一级指针变量;
(5) 对二级指针变量可以连续使用两个指针取值运算符*,进行两次降级,转换为一级指针变量所指向的变量;
下面举例进行分析:
char a;
char* pa = &a; //指针变量pa指向变量a;
char** pb; //定义二级指针变量;
pb = &pa; //把一级指针变量的地址赋给二级指针变量;
char* pc;
pc = *pb; //对二级指针进行降级,得到一级指针变量。就赋值给一级指针变量pc;
对二级指针变量pb降级, 把它所指向的变量赋给指针变量pc;由于 pb 指向 pa 变量,所以,相当于把 pa 变量赋给 pc 变量;所以,pa 指针变量指向变量a,pc 指针变量也指向变量 a。
*pc = 'B';
对一级指针变量pc进行降级,得到它所指向的变量a,给变量a赋值字符'B';
**pb = 'C';
对二级指针pb进行两次降级,可以分解如下:
(1) *pb 进行第一次降级,转换为 pb 指向的变量,就是指向指针变量pa;
(2) **pb 如同 *pa,就是第二次降级,转换为第一次降级得到 pa 指向的变量a;
(3) 所以,指针变量 **pb 转换为变量a,最终给变量a赋值字符'C';
程序测试例子如下:
程序运行结果如下:
可以看到,二级指针变量就是存放一级指针变量的地址。对指针变量使用“指针取值运算符*”就是对指针变量进行“降级”,转换为它指向的变量。就有:
(1) 二级指针变量降级,转换为二级指针变量所指向的一级指针变量;
(2) 一级指针变量降级,转换为一级指针变量所指向的变量;
注意:一级指针变量只能够使用一个取地址运算符*降级,如果使用两个,就会出现异常,我们来分析 一下:
char a;
char* pa = &a; //指针变量pa指向变量a;
**pa = 'A';
其中,对一级指针变量pa使用两个指针取值运算符*进行降级,可以分解如下:
(1) 先进行第一次降级,*pa 转换为指针变量pa所指向的变量a;
(2) 第二次降级,是对 *pa 表示的变量a进行降级,如同 *a 表达式,此时,出现异常,因为变量a不是指针变量,所以,不可以使用取地址运算符*进行操作。
通过上面的分析和总结,我们可以定义三级指针变量,如下:
char a; //定义char类型变量a;
char* pa = &a; //定义一级指针pa,指向变量a;
char** pb = &pa; //定义二级指针pb,指向指针变量pa;
char*** pc = &pb; //定义三级指针pc,指向二级指针变量pb;
可以看到,指针变量pc是三级指针变量。对它的操作,可以使用取指针运算符*进行降级操作。注意:在一般的项目开发过程中,不要定义难懂晦涩的代码,避免多级指针的使用。如果需要用到三级指针,应该考虑是否有其他方案可以代替,避免容易出错的代码设计。
,