【问题标题】:Why does scanf() need & operator (address-of) in some cases, and not others? [duplicate]为什么 scanf() 在某些情况下需要 & 运算符(地址),而在其他情况下不需要? [复制]
【发布时间】:2011-03-27 07:21:18
【问题描述】:

为什么我们需要在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)

但是字符串是怎么回事?

【问题讨论】:

标签: c arrays scanf ampersand


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      • 所有用于通过scanf() 接收值的变量都必须通过它们的地址传递。这意味着所有参数都必须指向用作参数的变量。

        scanf("%d", &amp;count);

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

        scanf("%s",address);

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

      【讨论】:

        【解决方案4】:

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

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

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

        %s 只是告诉scanf 期望一个以\0 终止的字符串,不管它是否适合字符数组scanf 并不关心。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • Because characters arrays are already pointers. 他们不是。
          • 这个神话什么时候会消失?
          猜你喜欢
          • 1970-01-01
          • 2019-08-08
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-08
          相关资源
          最近更新 更多