为什么我们需要放入一个&
运算符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)
.
但是字符串是怎么回事?
scanf 接受一个指针,指向您将值放入的任何内容。在第一个实例中,您传递对整数数组中位置 i 处的特定 int 的引用。在第二种情况下,您将整个数组传递给 scanf。在 C 中,数组和指针是同义词,可以互换使用(有点)。变量 s 实际上是一个指向内存的指针,它有 5 个字符的连续空间。
当您在表达式中使用数组的名称时(作为操作数sizeof
或地址操作符&
除外),它将计算为该数组中第一项的地址——即指针值。这意味着不需要&
获取地址。
当您在表达式中使用 int(或 short、long、char、float、double 等)时(同样,作为sizeof
or的操作数除外&
),它的计算结果为该对象的值。要获取地址(即指针值),您需要使用&
来获取地址。
所有用于接收值的变量都scanf()
必须通过它们的地址传递。这意味着所有参数都必须指向用作参数的变量。
scanf("%d", &count);
将字符串读入字符数组,不带任何索引的数组名就是数组第一个元素的地址。所以要将字符串读入字符数组地址,我们使用
scanf("%s",address);
在这种情况下,地址已经是一个指针,不需要在前面加上 & 运算符。
scanf("%d", a + i )
也可以。
%d
并且%s
只告诉scanf
期望什么,但在这两种情况下它都需要一个地址
在 C 中,数组和指针是相关的。
%s
只是说scanf
期待一个\0
终止的字符串,不管它是否适合字符数组scanf
。
因为字符数组已经是指针。
您可以将 C 数组视为指向堆栈分配的 RAM 量的指针。您甚至可以对它们使用指针操作而不是数组索引。*a
并且a[0]
两者都产生相同的结果(返回数组中的第一个字符)。