&string_name 或 string_name for %s 在 C 中打印字符串

&string_name or string_name for %s to print string in C

如果我在 C:

中有以下字符串
char s[]="Question";

然后我注意到以下两个 prtintf 都在终端中正确打印了字符串。

1.

printf("%s\n",s);

2.

printf("%s\n",&s);

在 C 中打印字符串的正确方法是什么。如果两者相同,那么遵循的约定是什么? 1 个还是 2 个?

谢谢。

第一个是正确的,对于第二个你应该从你的编译器那里得到一个警告,因为它是 UB,类似于:

[Warning] format '%s' expects argument of type 'char *'
char s[]="Question";
printf("%s\n",&s);

是未定义的行为,因为,

§7.21.6.1/8 The conversion specifiers and their meanings are:

[...]

s          If no l length modifier is present, the argument shall be a pointer to the initial element of             an array of character type.

§7.21.6.1/9 [...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

s 在此上下文中将衰减为指针类型。由于 & 产生一个指针,因此您传递给 printf 的类型实际上是一个指向指针的指针。