为什么scanf()需要&;某些情况下的操作员(地址),而不是其他情况下的操作员(地址)?

为什么scanf()需要&;某些情况下的操作员(地址),而不是其他情况下的操作员(地址)?,c,arrays,scanf,ampersand,C,Arrays,Scanf,Ampersand,为什么我们需要在scanf()中放置&运算符来存储整数数组中的值,而不是在char数组中存储字符串 int a[5]; for(i=0;i<5;i++) scanf("%d",&a[i]); 我们需要传入存储值的位置的地址,因为数组是指向第一个元素的指针。所以在int/float数组的情况下,它基本上意味着(a+i) 但是字符串是什么情况呢?scanf(“%d”,a+i)也可以工作 %d和%s只需告诉scanf需要什么,但在这两种情况下,它都需要一个地址 在C语言中,数组和指针是

为什么我们需要在
scanf()
中放置
&
运算符来存储整数数组中的值,而不是在char数组中存储字符串

int a[5];
for(i=0;i<5;i++)
scanf("%d",&a[i]);
我们需要传入存储值的位置的地址,因为数组是指向第一个元素的指针。所以在int/float数组的情况下,它基本上意味着
(a+i)

但是字符串是什么情况呢?

scanf(“%d”,a+i)
也可以工作

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

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


%s
只是对
scanf
说希望字符串
\0
终止,它是否适合字符数组
scanf
并不重要

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


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

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

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

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

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

    scanf(“%d”、&count)

  • Sting被读入字符数组,不带任何索引的数组名是数组第一个元素的地址

    scanf(“%s”,地址)

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


因为字符数组已经是指针了。
它们不是。这个神话什么时候会消失?
char s[5]; scanf("%s",s);