C语言 指向指针的指针

 

  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
a[1] 1001

 

 

 

指针数组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语言的代码训练中,然后,通过实践去加深对该知识点的理解与运用。

>>>下载训练环境与使用说明(使用真实的开发环境,结合游戏闯关进行编程训练)