c - 指针到指针在 C 中如何工作? (你什么时候可以使用它们?)

标签 c pointers

指针到指针在 C 中如何工作?
您什么时候可以使用它们?

最佳答案

假设一台 8 位计算机具有 8 位地址(因此只有 256 字节的内存)。这是该内存的一部分(顶部的数字是地址):

  54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|    | 58 |    |    | 63 |    | 55 |    |    | h  | e  | l  | l  | o  | \0 |    |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

您在这里可以看到,字符串“hello”从地址 63 开始。所以在这种情况下,如果这是内存中唯一出现的“hello”,

const char *c = "hello";

... 将 c 定义为指向(只读)字符串“hello”的指针,因此包含值 63。c 本身必须存储某处:在上面的例子中是位置58。当然我们不仅可以指向字符,还可以指向其他指针。例如:

const char **cp = &c;

现在cp指向c,也就是包含了c的地址(也就是58)。我们可以走得更远。考虑:

const char ***cpp = &cp;

现在cpp存放的是cp的地址。所以它的值为 55(基于上面的示例),您猜对了:它本身存储在地址 60。


至于为什么使用指向指针的指针:

  • 数组的名称通常会产生其第一个元素的地址。因此,如果数组包含类型为 t 的元素,则对数组的引用的类型为 t *。现在考虑类型为 t 的数组:自然地,对此二维数组的引用将具有类型 (t *)* = t ** , 因此是指向指针的指针。
  • 尽管字符串数组听起来是一维的,但实际上是二维的,因为字符串是字符数组。因此:char **
  • 函数 f 需要接受类型为 t ** 的参数,如果它要改变类型为 t * 的变量。
  • 许多其他原因太多,无法在此一一列举。

关于c - 指针到指针在 C 中如何工作? (你什么时候可以使用它们?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/897366/

相关文章:

pointers - 通过函数将指针设置为 nil

c - 错误: dereferencing pointer to incomplete type ‘struct student’ root->next->student_number = 17;

c - 尝试将内存分配给结构元素时收到段错误错误

c - RLE 编码...怎么了?

c - 我需要为此代码添加同步吗?

c++ - 激活记录是在构建二进制文件的哪个阶段定义的?

不提供模板参数的 C++ 类指针

c - 如何模拟 os x 上的低级按键?

c - 如何处理指向一个数组的结构组件,该数组的大小在声明结构之前是未知的?

c - 如何访问由双指针表示的二维数组的元素作为 C 中的一维数组