Ayuda con el uso de & y * en C

Iniciado por ProgramadorAnonimo, 28 Agosto 2021, 04:26 AM

0 Miembros y 1 Visitante están viendo este tema.

ProgramadorAnonimo

Que tal, tengo unas dudas respecto a cuestiones con punteros en C que no logro entender,  espero que me puedan ayudar, se los agradecería mucho.

El codigo es el siguiente:

struct alumno{
    int legajo;
    char genero;
    char nombre[30];
    float promedio;
};

int main(){

struct alumno *P; // PUNTERO PARA EL VECTOR DE ESTRUCTURAS EN MEMORIA DINAMICA
   int I;


    P = (struct alumno*) malloc(3 * sizeof(struct alumno));


    printf("\n\n\t INGRESO DE LOS DATOS");


       for( I = 0 ; I < N ; I++)
        {
            printf("\n\n\t INGRESE EL NOMBRE : ");
            gets((P+I)->nombre);

            printf("\n\t INGRESE EL LEGAJO : ");
            scanf("%d", &((P+I)->legajo));

            printf("\n\t INGRESE EL GENERO : ");
            scanf("%c", &((P+I)->genero));

            printf("\n\t INGRESE EL PROMEDIO : ");
            scanf("%f", &((P+I)->promedio));
            fflush(stdin);
        }

Lo que no logro entender es por que en los scanf es necesario utilizar el operador & para su direccion en memoria. No es que al estar apuntando a un campo de la struct alumno ya es una dirección? Y por que en el caso del gets no necesito ponerlo? No lo entiendo.

Gracias por su tiempo!

BloodSharp

Cita de: ProgramadorAnonimo en 28 Agosto 2021, 04:26 AMLo que no logro entender es por que en los scanf es necesario utilizar el operador & para su direccion en memoria. No es que al estar apuntando a un campo de la struct alumno ya es una dirección?

No, el puntero P contiene la dirección base de la memoria reservada por el sistema operativo para el proceso actual. Y para obtener la dirección hacia donde escribir en cada elemento necesitás el & de lo contrario solo obtendrías el valor del elemento...

Cita de: ProgramadorAnonimo en 28 Agosto 2021, 04:26 AMY por que en el caso del gets no necesito ponerlo? No lo entiendo.

Siempre que tengas un vector al llamar al "nombre de la variable en general" estás llamando a la dirección de memoria de la primera posición del elemento del vector, ambos códigos deberían ser igual al compilar:

gets((P+I)->nombre);
gets(&((P+I)->nombre[0]));



B#



Locura_23

#2
Hola te dejo una idea
Primeramente porque son distintas funciones y pueden pedir distintas cosas como parametros.
Pero la razon principal es que un arreglo de caracteres es en realidad una variable de tipo puntero a la primera direccion donde empieza ese arreglo (puntero a char)
gets() pide como parametro un puntero a char, y como ya "nombre" (el arreglo en tu estructura) es una variable de tipo puntero, (ya es una direccion de memoria per se), no necesitas colocarle los operadores de punteros, estos son de indireccion (el *) o direccion(el &).

En cambio con los demas campos (datos de tu estructura) cambia la cosa, como no son arreglos o variables de tipo puntero, necesitas usar el operador de direccion (&) para proveerle a la funcion scanf, la direccion de estas variables. Así scanf puede guardar el valor en sus respectivas variables.