带地址运算符的printf字符串文字

阿尔基斯(Alkis Kalogeris)
#include<stdio.h>

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

Output : 
Hello
Hello

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

伦丁

这是因为字符串文字被视为const char数组。该代码等效于编写此代码:

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

这非常令人困惑,我认为C FAQ很好地说明了这一点。对于所有C程序员来说,关于数组和指针的整章都应该是必读的。


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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章