2012-10-04 28 views
-2
int age; 
char name[10]; 

scanf("%d", &age); 
scanf("%s", name); 

在第一scanf功能我们使用'&'符号岁以前,但在第二scanf我们不使用'&' ,因为它是一个字符数组。有人可以告诉我为什么是这样吗?为什么我们没有在scanf使用“&”为焦炭arrray

+1

@AVD:请不要模块化你最近的一个问题VTC'd。社区投票对此非常好。 – ThiefMaster

回答

2

在大多数情况下,输入“的T N元件阵列”的表达将被转换为(“衰变”)输入“指针T”,并且表达式的值将是数组中第一个元素的地址。

当编写

scanf("%s", name); 

表达name具有类型 “的char 10元件阵列”;按照上述规则,将其转换为类型“指向char”的指针,其值与&name[0]相同。所以scanf收到一个指针值,而不是数组值。

此规则的例外是当阵列表达的sizeof_Alignof一个操作数,或一元&运营商,或者是字面被用来初始化一个声明另一阵列的字符串。

注意,表达式name&name会给你相同(数组的第一元素的地址是相同的数组的地址),但它们的类型将是不同的; name将具有类型char *,而&name将具有类型char(*)[10]或“指向10元素阵列char”的指针。

5

由于数组已经作为地址传递,而整数变量不是(因此明确需要通过地址运算符&传递的地址)。

4

数组名称本身引用该数组在内存中的开始位置。在这种情况下:

name == &name[0] 
-2

该数组名称已经是一个指针,它在这种情况下指向的内存位置为char。如果使用'&'它将是一个指向该数组的指针,并且将是char(*)[10]类型。但有利的论点必须是char *。在这种情况下,name类型为char *,与int类型的年龄不同。

+0

[John Bode的回答](https://stackoverflow.com/a/12726510/501011)更详细地解释了相同的概念,问题提出后5小时 - 而不是5年后。 –

+0

5年前我几乎只有13岁! –

相关问题