2012-05-15 180 views
6

我想從stdin中讀取一個數字。我不明白爲什麼scanf需要我的變量的名稱前使用&爲什麼scanf需要&?

int i; 
scanf("%d", &i); 

爲什麼scanf需要的變量的地址?

回答

12

它需要更改變量。由於C中的所有參數通過值傳遞如果您希望某個函數能夠更改參數,則需要傳遞一個指針。

這裏是展示它的超級簡單的例子:

void nochange(int var) { 
    // Here, var is a copy of the original number. &var != &value 
    var = 1337; 
} 
void change(int *var) { 
    // Here, var is a pointer to the original number. var == &value 
    // Writing to `*var` modifies the variable the pointer points to 
    *var = 1337; 
} 
int main() { 
    int value = 42; 
    nochange(value); 
    change(&value); 
    return 0; 
} 
3

因爲否則就只能改變一個副本而不是原始。

2

scanf需要addressOf運算符(&),因爲它將指針作爲參數。因此,爲了傳遞一個變量來設置一個傳入的值,你必須把一個指針放在變量之外,這樣它才能被改變。

指針必須傳遞給scanf的原因是,如果您只是傳遞了一個變量,您將無法直接更改scanf中的變量,因此您無法將其設置爲scanf所讀取的值。

希望這會有所幫助。

6

C函數的參數是總是「傳遞由值」,這意味着該函數scanf只看到任何的指定作爲自變量表達式的電流值的副本。

在這種情況下,&i是一個指向變量i的指針值。 scanf可以用這個來修改i。如果您通過i,那麼它只會看到一個未初始化的值,其中(a)是UB,(b)scanf不知道如何修改i的足夠信息。

1

scanf()存儲值,所以它需要一個地方來存儲它們。
這是通過提供使用addressof或&(與符號)運算符來存儲值的地址(在指針中) 來完成的。

0

sscanf的不需要&

int decimal; 
int *pointer = &decimal; 
scanf("%d", pointer); 

上面的代碼是有效

+0

你給它一個'*指針**。 –

3

這是沒有必要的。

char s[1234]; 

scanf("%s", s); 

工作得很好,沒有一個單一的&任何地方。什麼scanf和公司需要的是指針。爲了讓它修改一個特定的變量,你傳遞該變量的地址。對於默認情況下發生的幾種類型。對於其他人,您使用&來獲取地址(獲取指向該變量的指針)。