为什么我们不使用'&'在scanf中为char数组

时间:2012-10-04 06:03:01

标签: c pointers

int age;
char name[10];

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

在第一个scanf函数中,我们在年龄之前使用'&'符号,但在第二个scanf中我们不使用'&' 因为它是一个char数组。谁能告诉我为什么会这样?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

name == &name[0]

答案 2 :(得分:2)

在大多数情况下,类型为“{元素数组T”的表达式将转换为(“衰减”)以键入“指向T的指针”,并且表达式的值将是数组中第一个元素的地址。

写作时

scanf("%s", name);

表达式name的类型为“{-1}}的10个元素数组”;根据上述规则,它将转换为“指向char”的类型,其值与char相同。所以&name[0]接收指针值,而不是数组值。

此规则的例外情况是数组表达式是scanfsizeof或一元_Alignof运算符的操作数,或者是用于初始化另一个数组的字符串文字在声明中。

请注意,表达式&name将为您提供相同的(数组的第一个元素的地址与数组的地址相同),但他们的类型会有所不同; &name的类型为name,而char *的类型为&name,或者为“{1}}的10元素数组的指针”。

答案 3 :(得分:-2)

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