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

问题描述 投票:-1回答:4
int age;
char name[10];

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

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

c pointers
4个回答
2
投票

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

当你写作

scanf("%s", name);

表达式name具有类型“char的10元素阵列”;根据上面的规则,它被转换为“指向char”的类型,其值与&name[0]相同。所以scanf接收指针值,而不是数组值。

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

请注意,表达式name&name将为您提供相同的值(数组的第一个元素的地址与数组的地址相同),但它们的类型将不同; name将有类型char *,而&name将有类型char(*)[10],或“指向10个元素的char阵列”。


5
投票

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


4
投票

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

name == &name[0]

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.