2012-05-15 11 views
6

Quiero leer un número de stdin. No entiendo por qué scanf requiere el uso de & antes de que el nombre de mi variables:¿Por qué Scanf requiere &?

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

¿Por qué scanf necesita la dirección de la variable?

Respuesta

12

Necesita cambiar la variable. Como todos los argumentos en C se pasan por el valor, debe pasar un puntero si desea que una función pueda cambiar un parámetro.

Aquí está un ejemplo súper simple que muestra que:

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

porque de lo contrario sólo se altera una copia en lugar del original.

2

scanf requiere el operador addressOf (&) porque toma un puntero como argumento. Por lo tanto, para pasar una variable que se establecerá en un valor pasado, debe hacer un puntero fuera de la variable para poder cambiarla.

La razón por la cual se debe pasar un puntero a scanf es que si acaba de pasar una variable, no podría alterar directamente la variable dentro de scanf, por lo que no podría establecerlo en el valor leído por scanf.

Espero que esto ayude.

6

parámetros de la función C son siempre "paso-por-valor", lo que significa que la función scanf sólo ve una copia del valor actual de lo que se especifica como la expresión argumento.

En este caso &i es un valor de puntero que hace referencia a la variable i. scanf puede usar esto para modificar i. Si pasó i, solo vería un valor no inicializado, que (a) es UB, (b) no es información suficiente para scanf para saber cómo modificar i.

1

scanf() almacena valores, por lo que necesita un lugar para almacenarlos.
Esto se hace proporcionando las direcciones (en los punteros) de donde almacenar los valores usando el operador addressof o (y comercial).

0

sscanf no requiere &

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

código anterior es válida

+0

Le esta dando un '* puntero **. –

3

No es necesario.

char s[1234]; 

scanf("%s", s); 

funciona bien sin un solo & en cualquier lugar. Lo que scanf y compañía necesitan son punteros. Para permitir que modifique una variable en particular, pasas la dirección de esa variable. Para algunos tipos que ocurren por defecto. Para otros, use & para tomar la dirección (obtenga un puntero a esa variable).

Cuestiones relacionadas