指针到指针在 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/