为什么scanf()需要&在某些情况下,运营商(地址),而不是其他人?

时间:2010-08-09 13:22:59

标签: c arrays scanf ampersand

为什么我们需要在&中放置一个scanf()运算符来存储整数数组中的值,而不是在将字符串存储在char数组中时?

int a[5];
for(i=0;i<5;i++)
scanf("%d",&a[i]);

但是

char s[5]; scanf("%s",s);

我们需要传入存储值的地址,因为数组是指向第一个元素的指针。因此,对于int / float数组,它基本上意味着(a+i)

但是字符串是什么情况呢?

5 个答案:

答案 0 :(得分:5)

scanf接受指向您放置值的任何内容的指针。在第一个实例中,您将对整数数组中位置i处的特定int传递引用。在第二个实例中,您将整个数组传递给scanf。在C中,数组指针是同义的,可以互换使用(有点)。变量s实际上是一个指向内存的指针,该内存具有5个字符的连续空间。

答案 1 :(得分:2)

当您在表达式中使用数组的名称时(sizeof的操作数或运算符&的操作数除外),它将计算为该中第一项的地址数组 - 即指针值。这意味着获取地址不需要&

在表达式中使用int(或short,long,char,float,double等)时(同样,除sizeof&的操作数外),它会计算为该对象的价值。要获取地址(即指针值),您需要使用&来获取地址。

答案 2 :(得分:1)

scanf("%d", a + i )也有效。

%d%s只是告诉scanf会发生什么,但在这两种情况下都需要一个地址

在C中,数组和指针是相关的。

%s只是对scanf说,期望一个\0终止的字符串,无论它是否适合字符数组,scanf都不关心。

答案 3 :(得分:0)

  • 所有用于通过scanf()接收值的变量都必须通过其地址传递。这意味着所有参数都必须指向用作参数的变量。

    scanf("%d", &count);

  • 将字符串读取到字符数组中,而没有任何索引的数组名称是数组第一个元素的地址。因此,我们将字符串读入字符数组地址中

    scanf("%s",address);

  • 在这种情况下,地址已经是指针,并且不需要在&运算符之前。

答案 4 :(得分:-2)

因为字符数组已经是指针。

您可以将C数组视为指向堆栈分配的RAM量的指针。您甚至可以对它们使用指针操作而不是数组索引。 *aa[0]都会产生相同的结果(返回数组中的第一个字符)。