[英]Using scanf() for arrays in C
眾所周知,在掃描數組時在 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() 中使用 & 是可選的”是錯誤的,或者至少是嚴重誤導。
在scanf
使用%d
,相應的參數必須是指向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
的錯誤類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.