为什么有些情况下scanf()需要使用&运算符(取地址符),而有些情况下则不需要?

5

为什么在将值存储到整数数组中时,需要在scanf()中使用&运算符,但在将字符串存储到字符数组中时不需要?

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

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

由于数组是指向第一个元素的指针,所以我们需要传递存储值的位置地址,因此在使用 int/float 数组时,基本上意味着 (a+i)

但对于字符串又是怎样的情况呢?


http://c-faq.com/stdio/scanf1a.html - jamesdlin
5个回答

8

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


3
当您在表达式中使用数组的名称(除了作为sizeof或取地址运算符&的操作数),它将计算为该数组中第一个项目的地址,即指针值。这意味着不需要使用&来获取地址。
当您在表达式中使用int(或short、long、char、float、double等)时(同样,除了作为sizeof&的操作数),它会计算为该对象的值。要获取地址(即指针值),需要使用&来获取地址。

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

    scanf("%d", &count);

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

    scanf("%s",address);

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


1

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

%d%s 只是告诉 scanf 应该期望什么,但在两种情况下它都期望一个地址。

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

%s 只是告诉 scanf 应该期望一个以 \0 结尾的字符串,无论它是否适合字符数组,scanf 都不会关心。


-2

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

你可以把C数组看作是指向栈分配的一定量RAM的指针。你甚至可以使用指针操作来代替数组索引。*aa[0]都会产生相同的结果(返回数组中的第一个字符)。


3
因为字符数组已经是指针了。这不是正确的说法。 - P.P
这个神话什么时候才会消失? - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接