scanf() 和 printf() 中的字符串变量名称前的与号还是没有与号?

3 c string printf scanf

我使用的编译器是 Dev C++ 5.11。TDM-GCC 4.9.2 32 位调试。C99 模式。

1.

 char str1[100], str2[100];
 scanf("%s %s", &str1, &str2);
 printf("%s %s", &str1, &str2);
Run Code Online (Sandbox Code Playgroud)

2.

 char str1[100], str2[100];
 scanf("%s %s", &str1, &str2);
 printf("%s %s", str1, str2);
Run Code Online (Sandbox Code Playgroud)

3.

 char str1[100], str2[100];
 scanf("%s %s", str1, str2);
 printf("%s %s", str1, str2);
Run Code Online (Sandbox Code Playgroud)

每个代码都有效。为什么?我很困惑。

Som*_*ude 5

您需要记住的第一件事是数组自然会衰减到指向它们的第一个元素的指针。也就是说,在你的例子中str1&str1[0]是相等的。

要记住的第二件事是,指向数组的指针和指向其第一个元素的指针将指向相同的位置,但它们在语义上是不同的,因为它们是不同的类型。再次以您的数组str1为例:当您这样做时,&str1您会得到 type 的东西char (*)[100],而普通str1(或其等效物&str[0])则会得到 type 的东西char *。这些是非常不同的类型。

你需要记住的最后一件事是,无论是scanfprintf当读出/打印字符串需要一个指向char(即char *)。有关详细信息,请参见例如this scanf(和 family)this printf(和 family)参考资料。

所有这意味着您的问题中只有备选方案 3 是正确的。