0

为什么 scanf 需要 & 用于 int 而不需要用于 char?

  int main ()
     {
        char str [80];
        int i;

        printf ("Enter your family name: ");
        scanf ("%s",str);  
        printf ("Enter your age: ");
        scanf ("%d",&i);

        return 0;
    }
4

4 回答 4

1

标准库函数scanf()需要一个与您要读取的数据相对应的指针。所以你总是需要传递一个指针。

在 的情况下char[],数组名称衰减为指向数组第一个元素的指针,这就是您不使用&char 数组的原因。事实上,&在传递给 scanf() 时对 char 数组使用与号 () 是错误的,因为类型是&charArrayis char (*)[N],而 scanf() 需要一个char*作为格式说明符%s

如果你有指针,那么你可以直接传递它们。例如

int *p;
char *c;
p = malloc(sizeof(int)); // one int
c = malloc(100); // 100 bytes  
scanf("%d%99s", p, c);

如上所述,您不要&在这里使用,因为参数已经是指针并且使用&是错误的,因为这会使它们成为指向指针的指针。

因此,&只要 scanf() 的参数不是指向要读取的类型的对象的指针,就可以使用。

于 2013-08-10T23:57:59.207 回答
1

scanf()需要一个指针(内存地址)来扫描数据。虽然str是一个字符数组,但str在表达式中使用时(例如,作为 scanf 的参数),它实际上表示其第一个元素的内存地址。但是,对于一个int,您必须明确告诉scanf()使用它的内存地址,这就是您使用&(address-of) 运算符的原因。

于 2013-08-10T23:31:44.223 回答
1

becase 是str数组第一项的地址,而i只是 int 的名称,&i表示数组的地址int i

于 2013-08-10T23:37:12.763 回答
0

str衰减为指针,因为它是一个数组(因此它指向它的第一个元素,这并不意味着数组和指针是同一件事)。i需要&因为scanf需要存储值的地址,所以需要i.

于 2013-08-10T23:24:54.823 回答