c - char数组和int之间的Scanf差异

时间:2017-02-02 19:13:21

标签: c scanf

我已经阅读了一本书中的下一个代码,但它没有解释为什么使用这个代码

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

为什么年龄需要&,但是字符数组的名称不是? (第10和14行)

编辑: 在格式化错误的过程中,我的图像出现了错误。直接链接在这里:  http://i66.tinypic.com/14ngs4m.png

4 个答案:

答案 0 :(得分:2)

char name[25];

此处name是名称字符数组的第一个地址。

name == &name[0];

答案 1 :(得分:1)

当作为参数传递给函数时,数组会衰减到指向其第一个元素的指针。

如果您想测试一下,可以执行以下操作:

name[0] = 'A';
scanf("%s", name+1);
// Enter in "BCDEF" when running the program
printf("%s\n", name);

请注意,在这种情况下填写的内容是从索引1开始的数组,而不是0.索引0是完整的 - 您的输出是ABCDEF

答案 2 :(得分:1)

正如@Ethan在这个问题的另一个版本中所建议的,scanf需要addressOf运算符(&),因为它将指针作为参数。因此,为了传入要设置为传入值的变量,您必须从变量中指出一个指针,以便可以更改它。

必须将指针传递给scanf的原因是,如果你只是传递一个变量,你将无法直接改变scanf中的变量,所以你不能&#39 ; t将其设置为scanf读入的值。

然而在另一种情况下,

char i[1234];

scanf("%s", i);

在任何地方都没有单&的情况下工作正常。 scanf和公司需要的是指针。要让它修改特定变量,请传递该变量的地址。对于默认情况下发生的几种类型。对于其他人,您使用&获取地址(获取指向该变量的指针)。

答案 3 :(得分:1)

除非它是sizeof或一元&运算符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则类型为表达式 " N - T"的元素数组将被转换,或者#34;衰减",转换为"指向T"的类型的表达式,并且表达式的值将是第一个元素的地址数组。在声明中

scanf( "%s", name );

表达式 name的类型为char [N];因为它不是sizeof或一元&运算符的操作数,所以"衰变"输入char *,结果是name[0]的地址。它和写作一样

scanf( "%s", &name[0] );

与写

相同
scanf( "%s", &name );

在这种情况下,name是一元&运算符的操作数,因此不是"衰减"要键入char *,表达式&name的类型为char (*)[N],或者"指向N的指针 - char"的元素数组,以及它的值将是整个数组的地址。

现在,在C中,事实证明数组的地址和数组的第一个元素的地址是相同的,但该地址的表示可能因您是否&而不同#39;将其视为char *char (*)[N]

%s转换说明符期望其对应的参数具有类型char *,因此您想要编写scanf( "%s", &name );。因此明显不一致。