我正在使用的编译器是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);
char str1[100], str2[100];
scanf("%s %s", &str1, &str2);
printf("%s %s", str1, str2);
char str1[100], str2[100];
scanf("%s %s", str1, str2);
printf("%s %s", str1, str2);
每个代码都有效。为什么?我很困惑。
答案 0 :(得分:4)
首先要记住的是,数组自然地衰减指向第一个元素的指针。也就是说,在您的示例中str1
和&str1[0]
相等。
要记住的第二件事是指向数组的指针和指向其第一个元素的指针将指向相同的位置,但它们在语义上是不同的,因为它们是不同的类型。再次以您的数组str1
为例:当您执行&str1
时,您会得到char (*)[100]
类型的内容,而只有str1
(或等效的&str[0]
) char *
类型的东西。那些是非常不同的类型。
您需要记住的最后一件事是,scanf
和printf
在阅读/打印字符串时都会指向char
(即char *
)。参见例如this scanf
(and family)和this printf
(and family)参考了解详情。
这意味着只有你问题中的备选方案3是正确的。
答案 1 :(得分:1)
在C中,任何数组类型的表达式都会隐式转换为指向数组第一个元素的指针,除非它有引用运算符。
scanf("%s %s", &str1, &str2);
是
scanf("%s %s", &str1[100], &str2[100]);
并且数组的地址始终与第一个元素的地址相同。
答案 2 :(得分:1)
str1
给第一个元素一个char指针char*
,它将被分配在数组的第一个地址。&str1
为整个数组提供数组指针,类型为char(*)[100]
。%s
格式说明符,您可以告诉printf将传递的指针视为char*
。因此,无论您传递哪种指针类型,它都会转换为此类型。char(*)[100]
到char*
的这种特殊指针转换必须产生完全相同的地址,因此无论您使用哪种指针类型,代码都能正常工作。答案 3 :(得分:0)
因为string是char的数组。所以数组的地址是地址哦它是第一个元素。
他们只是有不同的类型。