C 指向指针的指针

 

  在接下来的时间里面,我们准备为大家介绍"指向指针的指针"。


  (1)指向指针的指针:指向,指针数据的,指针变量,称为指向指针的指针。

     看完这个解析相信大家都有一种感觉,就是是完全不知道你在说什么,

     因为这个内容比较难理解,所以,我们需要结合例子来作进一步的学习。

 

  (2)

    例子:

      //下面这行代码定义了整型变量数组a,并存放了2个整型值,分别是1,2。

      int a[ 2 ] = {1,2};  

 

      //下面这行代码首先定义了一个整型指针数组num

       然后,通过运算符&取出数组a[0]、a[1] 的地址分别赋给指针数组num。

      int * num [ 2 ] = { &a[ 0 ], &a[ 1 ] };

 

    接下来,我们先看看下面的列表:

 

变量数组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中的“指向指针的指针”这个知识点,但是,如何去运行用它呢?所以,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对每个知识点的理解和运用,以及“尽快进入到编程的状态”

 

      不要停留在理论规则上面,快动起来吧!

 

(通过游戏模式学习与训练,需要在电脑上运行)

进入游戏学习与训练