【问题标题】:Understanding complex pointer and address-of operators using *&*&p in C在 C 中使用 *&*&p 理解复杂的指针和地址运算符
【发布时间】:2012-09-06 15:20:58
【问题描述】:

谁能在下面解释一下 printf 是如何打印 hello 的?

#include<stdio.h>

void main()
{
 char *p;
 p="hello";
 printf("%s",*&*&p);
}

我知道*&p...表示p中的值,即字符串“hello”的地址。最初的 *& 发生了什么

【问题讨论】:

  • *&amp;,先取地址再解引用就是身份,所以*&amp;*&amp;p就是p
  • 一个疑问...假设 p 的地址是 200 而“hello”的起始地址是 100...所以 *&*&p---*&*200---*&100...。现在 &100 会给出什么......通常 &p 表示变量 p 的地址......以及它将如何为 &100 工作......感谢回复
  • 不,这样不行。只能取左值的地址,所以&amp;100没有意义。 &amp;p 给你一个char**,指向p。取消引用,*&amp;p 为您提供&amp;p 指向的对象,即p
  • 感谢您的回复...现在我明白了...

标签: c++ c pointers addressof


【解决方案1】:

正如你所说,*&amp;p 表示p,这意味着连续的*&amp; 相互抵消。因此*&amp;*&amp;p 也变成了p

正如@Kerrek 所说(在评论中)*&amp;p 会产生一个左值,所以您再次获取它的地址。


请注意,您的代码不符合标准。 main() 必须有 int 作为返回类型。而且您不能将"hello" 分配给非常量 char*。它必须是const char*。符合标准的代码是这样的:

#include<stdio.h>

int main()
{
   const char *p = "hello"; 
   printf("%s",*&*&p);
}

【讨论】:

  • 也许值得注意的是*&amp;p是一个左值,所以你可以再取它的地址...
  • 干杯。我只是想有人可能会来问为什么**&amp;&amp; 不起作用:-)
  • "您不能将“hello”分配给非常量 char*。它必须是 const char*。"或许值得指出的是,C 和 C++ 在这里有所不同。在 C 中,"hello" 的类型是 char[6],将其分配给 char* 是完全合法的(因为尝试修改字符串文字是未定义的行为,通常最好只将它们分配给 const char*s不过也在 C 中)。
  • @DanielFischer:是char[6] 还是const char[6]
  • 在 C 中是 char[6],在 C++ 中是 const char[6]
【解决方案2】:

&amp;pp的地址。

*p是地址p所指向的东西。

*&amp;p*(&amp;p) 地址&amp;p 所指向的东西——即p 本身(即地址“p 的地址”所指向的东西)。

因此,*&amp;p 只是 p - *&amp; 相互抵消。您可以重复此操作:*&amp;*&amp;p 仍将是 p。您可以无限执行此广告:*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;p 也将是 p

【讨论】:

    【解决方案3】:

    '*&' 相互抵消。您正在获取 p 的地址,然后再次取消引用它。所以最终的结果就是 p。

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      相关资源
      最近更新 更多