【发布时间】:2016-05-03 11:16:05
【问题描述】:
我是 C 新手,具有良好的 java 背景,我正在尝试理解指针和数组。
我知道下标operator[] 是数组定义的一部分,所以:
int numbers[] = {1,3,4,5};
将创建一个整数数组,在内存中表示为 16 个字节,4 个 4 个字节:
numbers[0] = 1, address 0061FF1C
numbers[1] = 3, address 0061FF20
numbers[2] = 4, address 0061FF24
numbers[3] = 5, address 0061FF28
但是,当涉及到指针时,我的知识开始崩溃,所以如果我要创建指向数组编号的指针,我会执行以下操作:
int *pNumbers = &numbers[0];
看起来像这样:
我猜它的大小是 4 个字节?
但是 ** 我读为“指向指针的指针”,这对我来说毫无意义,为什么有人想要指向指针的指针,当然如果 a->b->c 那么 a->c 就足够了?我知道我遗漏了一些东西,它一定与数组有关,因为argv 可以是char[ ] 或char ** 类型,如下所示:
int main(int argc, char **argv){}
所以:
- 这是什么 (
**)? - 它有什么用?
- 它在内存中是如何表示的?
【问题讨论】:
-
您想要一个指向指针的指针,原因与您想要指向任何东西的指针相同。例如,修改它指向的指针。
-
指向指针的指针非常有意义,并且一直在使用。此外,
int并不总是 4 个字节。在某些机器上是这样。在 64 位机器上,它可能是 8 个字节。在某些微处理器上,它是 2 个字节。int的大小是sizeof (int)。这将永远是正确的。 -
@Marged 我问了它有什么用途,另外两个问题我暗示我可能已经知道了,但我不是 100% 确定,这就是我明确提出的原因。我选择的答案很好地说明了如何使用这些指针,因为您标记的问题的答案说明了 * 和 & 运算符的工作原理,正如我根据我在问题中提出的内容已经知道的那样,请参阅“int *pNumbers = &numbers [0];"
-
@BenVoigt 我认为这个问题的答案帮助我弄清楚我的问题更多是内存模型而不是指针的指针。在 Java 中,我只是有一条规则,您可以操作对象,但不能操作原语。到目前为止,这似乎对我有用,我已经编程了将近两年,但现在我开始质疑我对内存模型的了解。除非您可以说 C 只有原语,并且指针允许您通过传递引用原始原语的值来扩展原语的范围?或者我只是完全愚蠢。 (这完全有可能)
-
@immibis 这是我对“按价值传递”和按引用传递的理解“我现在明白了:)。谢谢!
标签: arrays c pointers memory pointer-to-pointer