为什么我们不在scanf中使用’&’来表示char arrray
int age; char name[10]; scanf("%d", &age); scanf("%s", name);
在第一个scanf
函数中,我们在age之前使用'&'
符号,但在第二个scanf
我们不使用'&'
因为它是char数组。 谁能告诉我为什么会这样?
在大多数情况下,类型为“N元素数组T
”的表达式将转换为(“衰减”)以键入“指向T
指针”,表达式的值将是数组中第一个元素的地址。
当你写作
scanf("%s", name);
表达式name
类型为“10-element array of char
”; 根据上面的规则,它被转换为“指向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 *
,而不是age类型为int
。