0
#include<stdio.h>

int main()
{
    printf("%s\n", "Hello");
    printf("%s\n", &"Hello");
    return 0;
}

Output : 
Hello
Hello

谁能向我解释为什么"Hello"&"Hello"产生相同的结果?

4

4 回答 4

6

应用于&“Hello”会产生一个指向该数组的指针(是的,它是一个数组,并且在此上下文中它不会衰减为指针)。

它仍然指向同一个位置,但它有不同的类型(它有char (*)[6],即一个指向 6 个字符数组的指针)。printf忽略指针的真实类型并将其视为char *“有效”。


从技术上讲,对说明符使用“错误”的对象类型printf是未定义的行为。打开警告应该在现代编译器中指出这一点。

于 2013-10-01T14:47:58.710 回答
3

这是因为字符串文字被视为const char数组。代码相当于这样写:

char array [] = "Hello";
printf("%s\n", array);
printf("%s\n", &array);
  • 当您将数组名称传递给需要指针的函数时,数组“衰减”为指针。
  • 当你传递数组的地址时,你会得到一个数组指针……它也指向同一个地址。

这很令人困惑,我认为C FAQ很好地解释了它。关于数组和指针的整章应该是所有 C 程序员的必读内容。


另一件值得注意的事情:优化器使用一种叫做“字符串池”的东西,这意味着如果编译器在源代码中两次遇到相同的字符串文字,它将把它存储在同一个地址。因此,您的代码实际上只是将同一内存位置的内容打印了两次。要查看是否使用了字符串池,只需运行以下代码:

printf("%p\n", "Hello");
printf("%p\n", "Hello");

只要字符串相同,它就应该打印两次相同的地址。更改其中一个字符串,您将获得不同的地址。

于 2013-10-01T14:56:41.043 回答
0

这是在上下文printf%s

以下的基地址相同:

&"Hello" ==> &"Hello"[0] ==> "Hello"+0 ==> "Hello"

于 2013-10-01T14:45:57.390 回答
0

"Hello"并且&"Hello"都返回char数组(字符串)的基地址。

并且您正在使用%s,它用于字符串变量的打印

于 2013-10-01T14:53:41.307 回答