0

任何人都可以在下面解释 printf 如何打印 hello 吗?

#include<stdio.h>

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

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

4

3 回答 3

7

正如你所说,*&p意味着p,这意味着连续*&取消。因此也*&*&p变得p

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


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

#include<stdio.h>

int main()
{
   const char *p = "hello"; 
   printf("%s",*&*&p);
}
于 2012-09-06T15:24:02.677 回答
1

&p是 的地址p

*p是地址指向的东西p

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

因此事实证明,这*&p只是p-*&相互抵消。您可以重复此操作:*&*&p仍将是p. 您可以无限执行此操作:*&*&*&*&*&*&*&*&*&p也将是p.

于 2012-09-06T15:24:56.360 回答
0

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

于 2012-09-06T15:25:26.817 回答