6

为什么我们需要放入一个&运算符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).

但是字符串是怎么回事?

4

5 回答 5

8

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

于 2010-08-09T13:30:02.447 回答
3

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

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

于 2010-08-09T13:53:23.560 回答
2
  • 所有用于接收值的变量都scanf()必须通过它们的地址传递。这意味着所有参数都必须指向用作参数的变量。

    scanf("%d", &count);

  • 将字符串读入字符数组,不带任何索引的数组名就是数组第一个元素的地址。所以要将字符串读入字符数组地址,我们使用

    scanf("%s",address);

  • 在这种情况下,地址已经是一个指针,不需要在前面加上 & 运算符。

于 2018-12-05T08:58:17.543 回答
1

scanf("%d", a + i )也可以。

%d并且%s只告诉scanf期望什么,但在这两种情况下它都需要一个地址

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

%s只是说scanf期待一个\0终止的字符串,不管它是否适合字符数组scanf

于 2010-08-09T13:28:47.083 回答
-2

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

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

于 2010-08-09T13:29:28.047 回答