int age;
char name[10];
scanf("%d", &age);
scanf("%s", name);
在第一个scanf
函数中,我们在年龄之前使用'&'
符号,但在第二个scanf
中我们不使用'&'
,因为它是一个char数组。谁能告诉我为什么会这样?
在大多数情况下,类型为“T
的N元素数组”的表达式将转换为(“decay”)以键入“指向T
的指针”,并且表达式的值将是数组中第一个元素的地址。
当你写作
scanf("%s", name);
表达式name
具有类型“char
的10元素阵列”;根据上面的规则,它被转换为“指向char
”的类型,其值与&name[0]
相同。所以scanf
接收指针值,而不是数组值。
此规则的例外情况是,数组表达式是sizeof
,_Alignof
或一元&
运算符的操作数,或者是用于初始化声明中的另一个数组的字符串文字。
请注意,表达式name
和&name
将为您提供相同的值(数组的第一个元素的地址与数组的地址相同),但它们的类型将不同; name
将有类型char *
,而&name
将有类型char(*)[10]
,或“指向10个元素的char
阵列”。
因为数组已作为地址传递,而整数变量不是(因此明确需要通过&
address-of运算符传递的地址)。
数组名称本身引用内存中该数组的开头。在这种情况下:
name == &name[0]
数组名称已经是指针,在这种情况下它指向char
的内存位置。如果你使用'&'
它将是一个指向数组的指针,将是char(*)[10]
类型。但有利的论点必须是char *
类型。在这种情况下,name
是char *
类型,不同于int
类型的年龄。