为什么scanf()需要&运营商(地址)在某些情况下,而不是其他情况?
为什么我们需要在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
或&
的操作数),它将计算该对象的值。 要获取地址(即指针值),您需要使用&
来获取地址。
scanf("%d", a + i )
也可以。
%d
和%s
只是告诉scanf
期望什么,但在这两种情况下它都需要一个地址
在C中,数组和指针是相关的。
%s
只是对scanf
说,期望一个字符串是\0
终止,它是否适合字符数组或不是scanf
不关心。
因为字符数组已经是指针。
您可以将C数组视为指向堆栈分配的RAM量的指针。 您甚至可以对它们使用指针操作而不是数组索引。 *a
和a[0]
都产生相同的结果(返回数组中的第一个字符)。