【问题标题】:Dereferencing a double pointer just once?只取消一次双指针?
【发布时间】:2013-02-14 20:50:21
【问题描述】:

您好,我有一个关于双指针的问题。例如在这段代码中:

int a, b=2;
int *iPtr1, **iPtr2;

iPtr1  = &a;
iPtr2  = &iPtr1;  
*iPtr1 = b+3;
*iPtr2 = iPtr1;

在最后一行*iPtr2 = iPtr1; 只是告诉iPtr1 指向自己,因为只取消引用双指针一次就像使用iPtr1

【问题讨论】:

  • 其他人已经给了你答案,但我只想补充一点,IMO 绘制一张你的内存空间的小地图并显示什么指向什么是非常有帮助的。在这种情况下,您将拥有用于 a、b、iPtr1 和 iPtr2 的内存方块。最初 a 为空(未初始化)而 b 为 2。然后您将绘制一个从 iPtr1 到 a 的箭头(第一行代码 - iPtr1 = &a;)。然后为第二行代码画一条从 iPtr2 到 iPtr1 的线。以这种方式进行,用“*”表示“沿着箭头走,那里有什么”。
  • 感谢您的提示!我绝对需要像你说的那样练习写作和绘画,因为我倾向于只潜入编码,以后会花费我。

标签: c pointers indirection


【解决方案1】:

gdb 跟踪执行,然后你会看到最后一行*iPtr2=iPtr1 没有改变任何东西。 (有点像iPtr1=iPtr1

iPtr2 = &iPtr1; 上,iPtr2 已经指向iPtr1 指针所在的地址,而不是iPtr1 指向的地址。

注意:您不能用*iPtr2=iPtr1 替换iPtr2=&iPtr1,因为此时iPtr2 具有垃圾值(如果它是本地非静态变量)并且取消引用它是未定义的行为

【讨论】:

    【解决方案2】:

    它使*iPtr2 指向iPtr1 指向的任何东西。而iPtr2 指向iPtr1iPtr1 = iPtr1 相同。

    【讨论】:

    • 是的,我就是这么想的。我猜我的教授只是想欺骗我们或者可能是错误。
    • 这个问题有点老了,但我可以问点什么吗?在 strtol 函数中,函数签名中有一个 char** endptr ,可用于在输入字符串有错误且不是完全数字的情况下指向位置。现在检查它时(例如在手册页的示例中)检查是这样的: if(*endptr != 0){... 这不是错了吗? ( 当然不是错误)。为什么?
    • 我想了更多,我可以猜出我自己问题的答案。函数签名中 endptr 声明中的“**”是因为我们不需要“复制”传递给函数 strtol 的字符指针,而是我们想要更改它的地址并且我们希望这个地址是从函数的“外部”以及完成后也可以看到。所以通过“**”我们通过引用传递一个指针。我希望我是对的?
    • @Narnia 如果 strtol 函数到达 null-terminated 字符串的末尾,那么指针 endptr 将指向那个空终止符。并且那个空终止符将等于'\0',它恰好等于整数值0。取消引用 endptr 将为您提供值 0
    • @Narnia 另外,参数被声明为指向指针的指针的原因是因为它模拟了按引用传递(C 没有)。您将endptr 声明为普通指针(即char *endptr),然后使用地址运算符& 将指针传递给变量,如&endptr
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2012-01-04
    • 1970-01-01
    • 2021-12-30
    • 2020-03-17
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多