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