簡體   English   中英

scanf()(C語言)讓我困惑

[英]scanf() (C Language ) confused me

我什么時候需要在C中插入/不插入& for scanf() 謝謝。

int main()
{
    char s1[81], s2[81], s3[81];

    scanf("%s%s%s", s1, s2, s3);

    // If replace scanf() with the expression below, it works too.
    // scanf("%s%s%s", &s1, &s2, &s3);

    printf("\ns1 = %s\ns2 = %s\ns3 = %s", s1, s2, s3);

    return 0;
}

//programming is fun
//
//s1 = programming
//s2 = is
//s3 = fun

scanf將掃描的值放入其參數指向的地址中。 &是地址運算符,它用於獲取變量的地址。

但是,您正在使用數組,並且當用作函數參數時,數組會降級為指針。 因此,在數組的情況下,您不需要使用&運算符。

例:

char s[81];
int n;
int* nptr;
//Initialize nptr to some meaningful value
scanf("%s %d %d",s,&n,nptr);

在這種情況下,我們需要使用&運算符來保存地址。 我們不需要將它與nptr一起使用,因為它已經是指向內存中某個位置的指針,也不是s,因為當數組傳遞給函數時,數組會被降級為指針。

格式說明符后面的參數必須是指針。 將數組名稱傳遞給函數時,將傳遞初始元素位置 ,因此您不需要在示例中使用& 你可以這樣做(來自K&R ):

int day, year;
char monthname[20];

scanf("%d %s %d", &day, monthname, &year);

由於日期和年份都是int ,因此必須使用&來獲取這些變量的地址。 由於monthname是一個數組,無&是必需的。

在C中,當您處理數組時:

int c_array[24];
c_array == &c_array == &c_array[0]

是的,它很有趣 - 它們看起來一樣(區別在於類型)。 這個

從comp.lang.c常見問題解答: 我認為你總是需要傳遞給scanf每個變量&

我強烈建議您閱讀comp.lang.c常見問題的其余部分。

s1返回數組第一個元素的地址,而&s1返回數組本身的地址。 第一個元素的地址和數組本身的地址是相同的,因此兩個表示都起作用。

只是一個猜測,但我認為這是因為s1s2s3是數組。

如果a是一個數組,則a&a在此上下文中生成指針:

  • a由於數組衰減到指針(C99, §6.3.2.1/ 3 ):

    除非它是sizeof運算符或一元&運算符的操作數 ,或者是用於初始化數組的字符串文字,否則將類型為''array of type''的表達式轉換為類型為''指針的表達式type''指向數組對象的初始元素,而不是左值。

    ...重點補充

  • &a作為&運算符的結果 - 它返回指向對象的指針。

Scanf接受可變數量的參數。 scanf的第一個參數是格式,然后n表示要存儲的值,而n是格式字符串中指定的格式數。 因為您正在使用數組,所以要存儲您必須提供數組基址的值。

//If int
int i;
scanf("%d",&i); // store int value at address &i

float f;
scanf("%f",&f); //store float value at address &f

int a[10];
scanf("%s",a); //store string or array value at a

如果在最后一行使用a混淆了你,你可以嘗試使用第一個元素的地址來做同樣的事情,即&a [0]。

希望能幫助到你,
GG

通常,您可以像在未注釋的行中一樣使用scanf。 C數組的工作方式是s1,s2等數組的名稱,而s3實際上是數組第一個元素的地址。 但是對於任何基元,您必須使用&variable語法。 例如:

float f;
scanf("%f", &f);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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