2012-05-15 6 views
6

Voglio leggere un numero da stdin. Non capisco il motivo per cui scanf richiede l'uso di & prima del nome della mia variabile:Perché scanf richiede &?

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

Perché scanf bisogno l'indirizzo della variabile?

risposta

12

È necessario modificare la variabile. Poiché tutti gli argomenti in C vengono passati in base al valore, è necessario passare un puntatore se si desidera che una funzione possa modificare un parametro.

Ecco un esempio di super-semplice dimostrarlo:

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

Perché altrimenti sarebbe alterando solo una copia anziché l'originale.

2

scanf richiede l'operatore addressOf (&) perché accetta un puntatore come argomento. Pertanto, per passare una variabile da impostare su un valore passato, è necessario creare un puntatore fuori dalla variabile in modo che possa essere modificato.

Il motivo per cui un puntatore deve essere passato a scanf è che se hai appena passato una variabile, non sarai in grado di modificare direttamente la variabile all'interno di scanf, quindi non potresti impostarla sul valore letto da scanf.

Spero che questo aiuti.

6

parametri delle funzioni C sono sempre "pass-by-value", il che significa che la funzione scanf vede solo una copia del valore corrente di tutto ciò che si specifica come l'espressione argomento.

In questo caso &i è un valore puntatore che si riferisce alla variabile i. scanf può utilizzare questo per modificare i. Se hai superato i, verrà visualizzato solo un valore non inizializzato, che (a) è UB, (b) non è sufficiente informazioni per scanf per sapere come modificare i.

1

scanf() memorizza i valori, quindi è necessario un luogo in cui archiviarli.
Questo viene fornito fornendo gli indirizzi (nei puntatori) di dove memorizzare i valori utilizzando addressof o & (E commerciale) operatore.

0

sscanf non richiede &

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

sopra codice è valido

+0

Si sta dando un '* puntatore **. –

3

non è necessaria.

char s[1234]; 

scanf("%s", s); 

funziona bene senza una sola & ovunque. Cosa scanf e società hanno bisogno sono puntatori. Per lasciare che modifichi una particolare variabile, si passa l'indirizzo di quella variabile. Per alcuni tipi che succede di default. Per gli altri, si utilizza & per prendere l'indirizzo (ottenere un puntatore a tale variabile).