int age;
char name[10];
scanf("%d", &age);
scanf("%s", name);
在第一scanf
功能我们使用'&'
符号岁以前,但在第二scanf
我们不使用'&'
,因为它是一个字符数组。有人可以告诉我为什么是这样吗?为什么我们没有在scanf使用“&”为焦炭arrray
int age;
char name[10];
scanf("%d", &age);
scanf("%s", name);
在第一scanf
功能我们使用'&'
符号岁以前,但在第二scanf
我们不使用'&'
,因为它是一个字符数组。有人可以告诉我为什么是这样吗?为什么我们没有在scanf使用“&”为焦炭arrray
在大多数情况下,输入“的T
N元件阵列”的表达将被转换为(“衰变”)输入“指针T
”,并且表达式的值将是数组中第一个元素的地址。
当编写
scanf("%s", name);
表达name
具有类型 “的char
10元件阵列”;按照上述规则,将其转换为类型“指向char
”的指针,其值与&name[0]
相同。所以scanf
收到一个指针值,而不是数组值。
此规则的例外是当阵列表达的sizeof
,_Alignof
一个操作数,或一元&
运营商,或者是字面被用来初始化一个声明另一阵列的字符串。
注意,表达式name
和&name
会给你相同值(数组的第一元素的地址是相同的数组的地址),但它们的类型将是不同的; name
将具有类型char *
,而&name
将具有类型char(*)[10]
或“指向10元素阵列char
”的指针。
由于数组已经作为地址传递,而整数变量不是(因此明确需要通过地址运算符&
传递的地址)。
数组名称本身引用该数组在内存中的开始位置。在这种情况下:
name == &name[0]
该数组名称已经是一个指针,它在这种情况下指向的内存位置为char
。如果使用'&'
它将是一个指向该数组的指针,并且将是char(*)[10]
类型。但有利的论点必须是char *
。在这种情况下,name
类型为char *
,与int
类型的年龄不同。
[John Bode的回答](https://stackoverflow.com/a/12726510/501011)更详细地解释了相同的概念,问题提出后5小时 - 而不是5年后。 –
5年前我几乎只有13岁! –
@AVD:请不要模块化你最近的一个问题VTC'd。社区投票对此非常好。 – ThiefMaster