何时使用&?

时间:2013-08-10 23:20:42

标签: c scanf

为什么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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

char[]的情况下,数组名称衰减为指向数组的第一个元素的指针,这就是为什么不对char数组使用&的原因。实际上,在传递给scanf()时使用&符号(&)作为char数组是错误的,因为&charArray的类型是char (*)[N]而scanf()期望{{1}格式说明符char*

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

%s

如上所述,你不要在这里使用int *p; char *c; p = malloc(sizeof(int)); // one int c = malloc(100); // 100 bytes scanf("%d%99s", p, c); 因为参数已经是指针而使用&是错误的,因为它会使它们指向指针。

因此,只要scanf()的参数不是指向您想要读入的类型的对象的指针,就使用&

答案 3 :(得分:0)

str衰减到一个指针,因为它是一个数组(因此它指向它的第一个元素,这确实意味着数组和指针是相同的东西)。 i需要&,因为scanf需要存储值的地址,因此需要i的地址。