¿Por qué scanf requiere &?

3 minutos de lectura

avatar de usuario
Mella

Quiero leer un número de stdin. no entiendo porque scanf requiere el uso de & antes del nombre de mi variable:

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

Por que scanf ¿Necesitas la dirección de la variable?

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

Aquí hay un ejemplo súper simple que lo muestra:

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;
}

  • Solo encontrando esto y aprendiendo yo mismo. Haga un seguimiento si alguien lee esto… ¿el & le está dando acceso a la ubicación almacenada para que pueda cambiar el valor? Eso es lo que yo entiendo de todos modos….

    – Dan

    18 de diciembre de 2018 a las 15:24

  • @Dan Sí, tienes razón. Aunque tienes toda la razón, si todavía te da un poco de miedo te recomiendo que veas los videotutoriales de “Ashley Mills” C en YouTube sobre punteros.

    – aderchox

    4 de enero de 2019 a las 7:46

Los parámetros de la función C son siempre “pass-by-value”, lo que significa que la función scanf solo ve una copia del valor actual de lo que especifique como expresión de argumento.

En este caso &i es un valor de puntero que se refiere a la variable i. scanf puede usar esto para modificar i. si pasaste ientonces solo vería un valor no inicializado, que (a) es UB, (b) no es información suficiente para scanf para saber como modificar i.

No es necesario.

char s[1234];

scanf("%s", s); 

Funciona bien sin un solo & en cualquier sitio. Qué scanf y la necesidad de la empresa son punteros. Para dejar que modifique una variable en particular, pasa la dirección de esa variable. Para algunos tipos eso sucede por defecto. Para otros, usas & para tomar la dirección (obtener un puntero a esa variable).

Porque de lo contrario solo estaría alterando una copia en lugar del original.

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

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

Espero que esto ayude.

avatar de usuario
Jainendra

scanf() almacena valores, por lo que necesita un lugar para almacenarlos.
Esto se hace proporcionando las direcciones (en punteros) de dónde almacenar los valores usando addressof o & (ampersand) operador.

avatar de usuario
jacekmigacz

sscanf no requiere &

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

el código anterior es válido

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad