我已经阅读了一本书中的下一个代码,但它没有解释为什么使用这个代码
scanf("%s", name);
scanf("%d", &age);
为什么年龄需要&,但是字符数组的名称不是? (第10和14行)
编辑: 在格式化错误的过程中,我的图像出现了错误。直接链接在这里: http://i66.tinypic.com/14ngs4m.png
答案 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 );
。因此明显不一致。