#include <stdio.h>
#include <stdlib.h>
int main(){
char name[100];
int age;
printf("Enter you name:\n");
scanf("%s", name);
printf("Enter you age:\n");
scanf("%d", &age);
printf("You are %s,\nYour age is %d", name, age);
return 0;
}
如果之前已经回答过这个问题,我提前道歉。我是编程新手,这是我的第一篇帖子。我刚刚学习 C,但我不明白这一点:为什么 int 变量 age 需要“&”,而数组变量 name 不需要?
由于 C 的历史,数组会自动转换为指向其第一个元素的指针,除非它是
sizeof
typeof 运算符或一元运算符的操作数&
,或者是用于初始化数组的字符串文字。所以
scanf("%s", name);
相当于scanf("%s", &name[0]);
。它确实将地址传递给了scanf
。在 C 语言的早期,没有处理数组或结构等聚合对象的规定——没有操作可以像对待单个对象一样对整个聚合对象进行操作。操作仅针对简单的单个项目执行,例如
char
、、和指针。int
当时float
的计算机比今天的计算机慢得多,性能也差得多,编程语言通常只做非常简单的事情。尽管如此,程序员还是需要以某种方式使用数组。由于该语言不支持使用数组名称来引用整个数组,就好像它是聚合对象的单个值一样,因此将数组自动转换为指针的概念旨在使使用数组更加容易。
scanf("%s", name);
用 而不是 来书写scanf("%s", &name[0]);
看起来更美观,也更容易输入。因此,这种便利性已成为该语言的一部分。在 C 中,你甚至无法分配结构,例如
a = b
为结构类型赋值。这是后来添加的。一旦编程语言和编译器变得足够强大,能够使更强大的构造切实可行,改变数组在 C 中的行为方式就为时已晚。要使a = b
数组发挥作用,我们必须取消数组到指针的自动转换。所以现在这是 C 的一个永久功能。变量名称表示其值,您需要使用“&”来明确获取其地址。另一方面,数组的名称已经充当了指向数组第一个元素的指针,就像名称本身就表示存储第一个元素name[0] 的内存地址一样。
因此,int 变量需要使用“&”运算符来获取其地址。
当gcc编译此代码时,name是一个指向数组的值,这样没有问题。但是如果你只是使用age,它将被age的实际值替换,而不是地址,所以你需要获取age的地址。使用&age就可以了。