簡體   English   中英

在 C 中對數組使用 scanf()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM