• C语言中指针的指针是如何工作的?


     

    我们有时看到这样地饿代码:

    int *ptr = &x;

    这里,ptr是一个指向x在内存中的地址的指针。

    假设有另外一条语句是这样地的:

    int **ptr2 = &ptr;

    我们定义了一个指向指针的指针。

    假设我们的计算机是8bit的,地址也是8bit(因此只有256字节的内存)。下图代表内存的一部分(上面的一排数字代表地址)。

      45   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69

    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

    |    | 58 |    |    | 63 |    | 55 |    |    | h  | e  | l  | l  | o  | |    |

    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

    从上面可以看到地址63是字符串“hello”开始的地方。这种情况,假设内存中只有一处出现了“hello”,那么:

    const char *c = "hello";

    定义c为指向字符串“hello”的指针,那么c里面的值是63。指针c自己也要存储在内存的某个地方,上面的例子中可以看到c存储在58的位置。既然我们能定义指向字符的指针,也就能定义指向指针的指针:

    const char **cp = &c;

    现在cp指向了c,cp中存储的是c的地址(58)。

    甚至可以更进一步:

    const char ***cpp = &cp;

    cpp内存的是cp的地址,也就是55(在上面的例子中),cpp自身存储在60的位置。

    为什么我们需要这些指针呢?

    • 数组名通常也是数组第一个元素的地址。如果数组中存储的数据类型是t,对数组引用的类型就是* t。假设有类型t的数组的数组(二维数组),自然地,对二维数组的引用类型就是*(*t)=**t,也即指向指针的指针。
    • 即使字符串的数组看起来像是一维的,事实上是二维的,因为字符串时字符的数组。因此,类型为char **。

  • 相关阅读:
    Qt Installer Framework翻译(7-0)
    Qt Installer Framework翻译(4)
    Qt Installer Framework翻译(6-0)
    Qt Installer Framework翻译(5-4)
    Qt Installer Framework翻译(5-3)
    Qt Installer Framework翻译(5-2)
    Qt Installer Framework翻译(5-1)
    Qt Installer Framework翻译(5-0)
    Qt Installer Framework翻译(3-5)
    angularjs1.X进阶笔记(3)——如何重构controller
  • 原文地址:https://www.cnblogs.com/programnote/p/4718299.html
Copyright © 2020-2023  润新知