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?
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 i
entonces 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.
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.
jacekmigacz
sscanf no requiere &
int decimal;
int *pointer = &decimal;
scanf("%d", pointer);
el código anterior es válido