我使用的编译器是 Dev C++ 5.11。TDM-GCC 4.9.2 32 位调试。C99 模式。
char str1[100], str2[100];
scanf("%s %s", &str1, &str2);
printf("%s %s", &str1, &str2);
Run Code Online (Sandbox Code Playgroud)
char str1[100], str2[100];
scanf("%s %s", &str1, &str2);
printf("%s %s", str1, str2);
Run Code Online (Sandbox Code Playgroud)
char str1[100], str2[100];
scanf("%s %s", str1, str2);
printf("%s %s", str1, str2);
Run Code Online (Sandbox Code Playgroud)
每个代码都有效。为什么?我很困惑。
您需要记住的第一件事是数组自然会衰减到指向它们的第一个元素的指针。也就是说,在你的例子中str1和&str1[0]是相等的。
要记住的第二件事是,指向数组的指针和指向其第一个元素的指针将指向相同的位置,但它们在语义上是不同的,因为它们是不同的类型。再次以您的数组str1为例:当您这样做时,&str1您会得到 type 的东西char (*)[100],而普通str1(或其等效物&str[0])则会得到 type 的东西char *。这些是非常不同的类型。
你需要记住的最后一件事是,无论是scanf和printf当读出/打印字符串需要一个指向char(即char *)。有关详细信息,请参见例如this scanf(和 family)和this printf(和 family)参考资料。
所有这意味着您的问题中只有备选方案 3 是正确的。