【问题标题】:What does this notation mean in C?这个符号在 C 中是什么意思?
【发布时间】:2009-10-10 20:14:06
【问题描述】:
int *w;
int **d;

d = &w;

**d 究竟存储了什么?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    赋值后,**d*w 相同。 d 是一个指向整数的指针;指向它指向的整数的指针是w。所以*dw**d*w

    【讨论】:

    • 不,**d*w相同——至少它们没有相同的值。虽然我想我知道你的意思(它们最终都指向同一个变量,但我认为这有点误导。
    • @Noldorin,请注意指向 C++ 标准文档,该文档指出取消引用的指针与其指向的内存的值不同?
    • 我认为这个答案令人困惑,因为它谈到了取消引用运算符,但原始代码没有取消引用任何内容。指针声明限定符恰好使用相同的 * 字形。我相信这就是诺德林所指的。这两个声明是不等价的,但是取消引用 d 两次与取消引用一次 w 相同,但我不认为在这种情况下这是一个有用的答案,并且想知道它是否被标记为“已接受”。
    • @Franci:我认为你误解了我的评论。此外,我们在这里谈论的是 C,而不是 C++。 :) @Clifford:这正是我所指的......我同意这个答案在这个问题上造成了混乱。如果 OP 正在阅读此内容,我敦促您至少阅读我的答案或 Jack Lloyd 的(基本上是正确的)。
    • 仅对于这段代码,如果您尊重**d,您可能会遇到分段错误或垃圾整数值,因为w 从未正确初始化。
    【解决方案2】:

    int ** 表示“指向int 的指针的指针”(也称为双指针)。

    现在,int *w 只是表示一个指向int 的指针,因此赋值d = &w 是说:“将w 的地址(它本身就是一个指针/地址)分配给d”。

    【讨论】:

      【解决方案3】:

      **d 的值与 *w 的值相同; *d 等于保存在 w 中的指针值;因为 d 是一个指向 int 的指针,所以你必须取消引用它两次才能得到实际值。

      【讨论】:

        【解决方案4】:

        w 存储一个 int 的地址。 d 存储指向 int 的指针的地址(除了在这种情况下它存储一个随机值,因为它没有被分配),在这种情况下是 d 的地址。

        【讨论】:

          【解决方案5】:

          **d 是一个指向 int 指针的指针,所以当你说 d=&w 时,**d 会有指针 *w 的地址,但除非你说 d=&w 并且刚刚声明 整数 *w int **d,除了: int *w 是指向 int 的指针,而 int **d 是指向指向 int 的指针,但绝不会说 d 将存储 w 的地址。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-13
            • 2021-08-19
            • 2019-06-26
            • 2019-09-14
            • 2015-02-18
            • 2017-02-04
            相关资源
            最近更新 更多