printf字符串文字与地址运算符

时间:2013-10-01 14:43:03

标签: c string printf address-operator

#include<stdio.h>

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

Output : 
Hello
Hello

有人可以向我解释为什么"Hello"&"Hello"会产生相同的结果吗?

4 个答案:

答案 0 :(得分:4)

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

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


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

答案 1 :(得分: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");

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

答案 2 :(得分:0)

这与printf&#39; s %s

有关

以下基地址相同:

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

答案 3 :(得分:0)

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

你正在使用%s,它用于打印字符串变量

相关问题