1、 指向指针的指针
指向指针的指针,其实,就是一个指针变量里面存放了另一个指针。
3、例子:
int a[ 2 ] = {1,2}; //这行代码定义了整型变量数组a,并存放了2个整型值,分别是1,2。
int * num [ 2 ] = { &a[ 0 ], &a[ 1 ] }; //这行代码首先定义了一个整型指针数组num,
然后,通过运算符&取出数组a[0]、a[1] 的地址
分别赋给指针数组num。
接下来,我们先看看下面的列表:
变量数组a |
内存地址 |
变量值 |
a[0] |
1000 |
1 |
a[1] |
1001 |
2 |
指针数组num |
内存地址 |
变量值 |
num[0] |
3000 |
1000 |
num[1] |
3001 |
1001 |
|
变量值1000是通过&a[0]取出的内存地址 |
变量值1001是通过&a[1]取出的内存地址 |
所以,通过上面的列表,我们可以了解到代码 int * num [ 2 ] = { &a[ 0 ], &a[ 1 ] };
就等价于下面的代码,
int * num [ 2 ] = { 1000, 1001 };
接下来,我们就定义一个指向,指针数据,的指针p,代码如下:
int * *p;
现在,我们就定义了一个(指向,指针数据,的指针p),而它的格式只是在指针变量定义时多加一个星号。
而现在的指针数据是,指针数组num ,而我们就需要让指针p,指向,指针数据num,所以,我们进行一个
赋值操作就可以了,代码如下:
p = num;
通过代码 p = num 我们就实现了指向一个指针数据num,的指针了,它就是p。
接下来,我们来看看如何使用p,代码如下:
int c = * *p;
在上面这行代码中,我们首先把* * p 分开三个部分来分析:
(1)第一部分,目前,经过代码 p = num 赋值以后,p中的值就是num指针数组在内存中的起始位置,
通过上面的表格,我们可以查看到num数组的起始位置是3000,也就是a[ 0 ] 的内存地址。
(2)第二部分,*p,就是指向3000这个内存地址并取出它的值,通过上面的表格,我们可以
看到,3000这个内存地址中所存放的值是1000,而这个1000是另一个内存地址。
所以,就要再找到内存地址1000中的值,所以,就要再看看第三部分。
(3)第三部分,* *p,现在*p 已经取出了内存地址3000中的值1000,所以,再通过第二个星号
来取出内存地址1000中的值,通过上面的例表,我们可以看出这个地址是属于数组a中
的a[0],所以,它的值是1。
这样,就把1取出来并赋给了变量c。
所以,从这个分析的过程,我们就可以了解到,为什么称p为指向指针的指针,因为,从上面的分析中,
我们可以了解到,第一个星号是要取出3000这个地址中的值,即取出指针3000中的值,所以,这里
是第一次指向指针。
然后,这个3000的指针(地址)中的值是另一个指针(地址)1000,所以,要通过第二个星号
取出指针1000中的值1,所以,这里是第二次指向指针。
而我们把两次指向指针的操作合并在一起,就是指向,指针的指针,即指向3000,再指向1000这个
内存地址。
=======================================================================
非常好,现在,我们已经掌握了C语言中的(指向指针的指针)但是,如何去运行用它呢?
所以,我们就需要通过下方的链接,进入到C语言的代码训练中,然后,通过实践去加深对该知识点的理解与运用。
>>>下载训练环境与使用说明(使用真实的开发环境,结合游戏闯关进行编程训练)
|