在 C 语言中使用 *&*&p 了解复杂的指针和地址运算符

Understanding complex pointer and address-of operators using *&*&p in C

本文关键字:复杂 指针 运算符 地址 了解 语言      更新时间:2023-10-16

下面有人能解释printf是如何打印hello的吗?

#include<stdio.h>
void main()
{
 char *p;
 p="hello";
 printf("%s",*&*&p);
}

我知道*&p…表示p中的值,即字符串"hello"的地址。在最初的*&

正如您所说,*&p表示p,即连续的*&取消。因此CCD_ 5也变成了CCD_ 6。

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


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

#include<stdio.h>
int main()
{
   const char *p = "hello"; 
   printf("%s",*&*&p);
}

&pp的地址。

CCD_ 15是由地址CCD_。

*&p*(&p)——由地址&p指向的东西——这就是p本身(即,由地址"p的地址"指向的东西)。

因此,*&p就是p——*&相互抵消。您可以重复这一点:*&*&p仍然是p。你可以无限次这样做:*&*&*&*&*&*&*&*&*&p也将是p

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