代码之家  ›  专栏  ›  技术社区  ›  cha

为什么在C中,int变量需要“&”运算符,而数组不需要?[副本]

  •  1
  • cha  · 技术社区  · 5 月前
    #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?

    3 回复  |  直到 5 月前
        1
  •  3
  •   Eric Postpischil    5 月前

    由于C的历史,数组会自动转换为指向其第一个元素的指针,除非它是 sizeof 或一类运算符或一元运算符 & 或者它是用于初始化数组的字符串文字。

    所以 scanf("%s", name); 相当于 scanf("%s", &name[0]); 。它确实会将地址传递给 scanf .

    在C语言的早期,没有处理数组或结构等聚合对象的规定,任何操作都不会像处理单个对象一样对整个聚合对象进行操作。仅对简单的单个项目执行操作,例如 char , int , float 和指针。计算机比今天的计算机慢得多,能力也差得多,编程语言通常做非常简单的事情。

    尽管如此,程序员还是需要以某种方式处理数组。由于该语言不支持使用数组的名称来引用整个数组,就像它是聚合对象的单个值一样,因此将数组自动转换为指针的概念旨在使使用数组更容易。写作 scanf(“%s”,名称); 而不是 scanf(“%s”,名称[0]); 看起来更好,更容易打字。因此,这种便利性成为了语言的一部分。

    你甚至不能在C中分配结构,比如说 a = b 对于一种结构类型。这是后来添加的。一旦编程语言和编译器变得足够强大,可以使更强大的构造变得实用,那么改变C中数组的行为就太晚了 a ____ b 对于数组,我们必须取消数组到指针的自动转换。所以现在这是C的一个永久特征。

        2
  •  1
  •   mrstronk    5 月前

    变量名表示其值,您需要 “&” 明确地获取其地址。另一方面,数组的名称已经充当了指向数组第一个元素的指针,就像 名称 单独表示第一个元素所在的内存地址 名称[0] 被存储。
    所以 “&” int变量需要运算符才能获取其地址。

        3
  •  0
  •   yc z    5 月前

    gcc编译此代码时,name是数组的一个值点,这很好。但如果你只使用age,它会被agenot the address的实际值替换,所以你需要获取age的address.use&年龄很好。