[英]Ampersand(&) and scanf in C?
我有以下多項選擇題,無法弄清楚為什么(A)和(C)不正確,請多加解釋! 以下問題中唯一的正確答案是(B)。
以下哪項是scanf的正確用法?
(A)int i=0; scanf("%d", i);
int i=0; scanf("%d", i);
(B)int i=0; int *p=&i; scanf("%d", p);
int i=0; int *p=&i; scanf("%d", p);
(C)char *s="1234567"; scanf("%3s", &s);
char *s="1234567"; scanf("%3s", &s);
(D)char c; scanf("%c", c);
char c; scanf("%c", c);
scanf
一個正確的地址來存儲結果:
(A) int i=0; scanf("%d", i);
i
是按值傳遞的,沒有地址:錯誤。
(B) int i=0; int *p=&i; scanf("%d", p);
p
是一個指向int的指針, scanf
可以將其結果存儲在這里:對
(C) char *s="1234567"; scanf("%3s", &s);
&s
是指向char *
的指針的地址,您不能在其中存儲字符串:錯誤
(D) char c; scanf("%c", c);
c
是通過值而不是地址傳遞的:錯誤
您必須將指針傳遞給該函數,以便它知道內存中該值的存儲位置。 如果只按值傳遞,它將把它當作一個內存地址,而所有的地獄都會崩潰。 因此,您可以使用&
引用變量的引用 (即內存地址)。
這就是A和D錯誤的原因。
至於C ,它看起來是正確的,因為您正在提供一個指針,但實際上是在引用該指針。 因此scanf
將覆蓋指針本身,而不覆蓋其指向的內存。
如果您剛剛提供s
,那么我們進入另一個禁地。 指針指向不允許修改的字符串文字 。 但是,如果它不是一個文字,但使用文字作為初始化它會好起來的,一個陣列提供你沒有更多的數據讀取比它可以存儲:
char s[] = "1234567"; scanf("%3s", s); /* this is okay */
了解此:
int i = 0; scanf(“%d”,i);
擴展:i變量的地址是什么? 對於該&運算符,給出i變量的地址。 scanf()獲取用戶輸入並將值存儲在該地址上。
char * s =“ 1234567”; scanf(“%3s”,&s);
說明:在這種情況下,您正在將字符串分配給字符指針,該字符串位於代碼部分。 此選項的主要目的是我們無法修改代碼部分。 但是在這種情況下,我們正在修改指針。 因此,在該指針指向新分配的地址之后,否則它可能輸入了錯誤的地址,然后出現分段錯誤。 因此我們丟失了先前分配的字符串。
指定符為%d
scanf
將輸入作為要掃描位置的地址。
用1。您輸入的輸入是i
,這是錯誤的
使用2.給定的輸入為p
,其地址為i
。在初始化期間將其設置為int *p=&i
。 所以這是正確的。
對於3.,說明符為%s
。 這將輸入開始存儲字符串的地址。 s
的輸入是一個數組,已經包含地址。 &s
是錯誤的。
對於4,您正在使用%c
說明符,該說明符還將獲取位置的地址。 因此,在這種情況下,輸入c
是錯誤的,因為要獲取需要的位置的地址&c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.