[英]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
是一個數組,無&
是必需的。
從comp.lang.c常見問題解答: 我認為你總是需要傳遞給scanf
每個變量&
。
我強烈建議您閱讀comp.lang.c常見問題的其余部分。
s1
返回數組第一個元素的地址,而&s1
返回數組本身的地址。 第一個元素的地址和數組本身的地址是相同的,因此兩個表示都起作用。
只是一個猜測,但我認為這是因為s1
, s2
和s3
是數組。
如果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.