簡體   English   中英

在C中使用&(&)和scanf嗎?

[英]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是通過值而不是地址傳遞的:錯誤

您必須將指針傳遞給該函數,以便它知道內存中該值的存儲位置。 如果只按值傳遞,它將把它當作一個內存地址,而所有的地獄都會崩潰。 因此,您可以使用& 引用變量的引用 (即內存地址)。

這就是AD錯誤的原因。

至於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);

說明:在這種情況下,您正在將字符串分配給字符指針,該字符串位於代碼部分。 此選項的主要目的是我們無法修改代碼部分。 但是在這種情況下,我們正在修改指針。 因此,在該指針指向新分配的地址之后,否則它可能輸入了錯誤的地址,然后出現分段錯誤。 因此我們丟失了先前分配的字符串。

為一個:

(A) int i=0; scanf("%d", i);

應該是:

(A) int i=0; scanf("%d", &i);

看一下scanf()簽名

指定符為%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.

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