众所周知,扫描数组时在 scanf() 中使用 & 是可选的,但在我的程序中,当我不使用 & 时,我会得到不同的输出。 程序如下:
#include<stdio.h>
int main()
{
int n, *a, count = 0;
scanf("%d",&n);
a = (int*) malloc(n*sizeof(int));
for(int i = 0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i = 0;i<n;i++)
{
for(int j = i;j<n;j++)
{
if(i!=j)
{
if(a[i] == a[j])
{
count++;
break;
}
}
}
}
printf("%d",count);
return 0;
}
当我使用 & 时,程序会打印 5,而当我不使用 & 时,程序会打印 7。有人可以解释一下这背后的原因吗? 谢谢!
最佳答案
“众所周知,扫描数组时在 scanf() 中使用 & 是可选的”这一说法是错误的,或者至少具有严重误导性。
当 %d
在 scanf
中使用时,相应的参数必须是指向 int
的指针。给定int n
,参数可能是&n
。给定 int *a = malloc(…)
和 int i
,参数可能是 &a[i]
。
在后一种情况下,参数也可以是 a
,因为 a
是指向 int
的指针。它指向分配空间中的第一个int
。
如果声明了一个数组,如int a[5]
,那么通常元素的地址,例如&a[i]
,应该用作scanf
的参数。但是,a
也可以用作参数。这是因为数组会自动转换为指向其第一个参数的指针,实际上是 &a[0]
。 (当数组是 sizeof
或一元 &
的参数或者是用于初始化数组的字符串文字时,不会发生这种自动转换。)
如果 a
是一个数组,并且您将 &a
传递给 scanf
来获取 %d
,那么这将是一个错误。 &a
不是指向 int
的指针;它是一个指向int
数组的指针。尽管它们指向内存中的同一位置,但它们具有不同的类型,而后者是传递给 scanf
的错误类型。
关于c - 在 C 中对数组使用 scanf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52458077/