对于下面的代码,我可以对scanf使用指针或字符数组
char name[10];
printf("Please enter your name: ");
scanf("%9s", name);我也可以这样做:
char *name = (char*)malloc(10)
printf("Please enter your name: ");
scanf("%9s", name);第二个显然是一个char*指针,但第一个不是--它是一个数组。为什么,如果它不是数组,并且scanf需要一个指针,那么我可以执行scanf("%9s", name)而不是被强制执行scanf("%9s", &name)吗
发布于 2021-01-08 12:37:23
除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则“T的N元素数组”类型的表达式将被转换为“指向T的指针”类型的表达式,并且表达式的值是数组的第一个元素的地址。
这适用于所有数组类型,而不仅仅是字符数组。
所以当你写下
scanf("%9s", name);表达式name从“char的10元素数组”类型转换为“指向char的指针”,scanf接收的是数组的第一个元素的地址。
这一点很重要-数组不是指针;数组表达式会在必要时转换为指针。
信不信由你,这种行为是有原因的。C是从早期的语言B派生而来的。在B中,数组对象有一个指向第一个元素的显式指针,下标操作a[i]被定义为*(a + i) -给定起始地址a,从该地址偏移i元素并取消对结果的引用。
在设计C时,Ritchie希望保留B的数组语义,但他不想保留这些语义所需的第一个元素的显式指针。因此,他没有为指针创建存储空间,而是创建了在必要时将数组表达式转换为指针表达式的规则。
这就是为什么数组很奇怪的原因。
发布于 2021-01-08 12:49:59
当使用"%9s"作为格式说明符时,scanf不会“接受指针或数组”。它只需要一个指针。当你给它一个数组的时候,会发生什么,编译器会变魔术。它创建一个指向数组第一个元素的指针,并将该指针传递给scanf。所以这两段代码是等价的:
/* Snippet A */
char name[10];
scanf("%9s", name);
/* Snippet B */
char name[10];
scanf("%9s", &name[0]);这不仅发生在scanf上,而且几乎每次需要一个指针并给它一个数组时都会发生。值得注意的是没有发生这种情况的地方是sizeof运算符。
https://stackoverflow.com/questions/65622975
复制相似问题