为什么在将值存储到整数数组中时,需要在scanf()
中使用&
运算符,但在将字符串存储到字符数组中时不需要?
int a[5];
for(i=0;i<5;i++)
scanf("%d",&a[i]);
但是
char s[5]; scanf("%s",s);
由于数组是指向第一个元素的指针,所以我们需要传递存储值的位置地址,因此在使用 int/float 数组时,基本上意味着 (a+i)
。
但对于字符串又是怎样的情况呢?
为什么在将值存储到整数数组中时,需要在scanf()
中使用&
运算符,但在将字符串存储到字符数组中时不需要?
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
或取地址运算符&
的操作数),它将计算为该数组中第一个项目的地址,即指针值。这意味着不需要使用&
来获取地址。sizeof
或&
的操作数),它会计算为该对象的值。要获取地址(即指针值),需要使用&
来获取地址。所有通过 scanf()
接收值的变量都必须通过它们的地址传递。这意味着所有参数必须指向用作参数的变量。
scanf("%d", &count);
字符串被读入字符数组中,没有任何索引的数组名称是数组第一个元素的地址。因此,要将字符串读入字符数组地址中,我们使用
scanf("%s",address);
在这种情况下,address 已经是指针,不需要在前面加上 & 运算符。
scanf("%d", a + i )
也可以工作。
%d
和 %s
只是告诉 scanf
应该期望什么,但在两种情况下它都期望一个地址。
在 C 中,数组和指针是相关的。
%s
只是告诉 scanf
应该期望一个以 \0
结尾的字符串,无论它是否适合字符数组,scanf
都不会关心。
因为字符数组已经是指针了。
你可以把C数组看作是指向栈分配的一定量RAM的指针。你甚至可以使用指针操作来代替数组索引。*a
和a[0]
都会产生相同的结果(返回数组中的第一个字符)。