elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con el uso de & y * en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con el uso de & y * en C  (Leído 2,873 veces)
ProgramadorAnonimo

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda con el uso de & y * en C
« en: 28 Agosto 2021, 04:26 am »

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!


En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: Ayuda con el uso de & y * en C
« Respuesta #1 en: 28 Agosto 2021, 05:28 am »

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?

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...

Y 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:

Código
  1. gets((P+I)->nombre);
  2. gets(&((P+I)->nombre[0]));


B#


En línea



Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Ayuda con el uso de & y * en C
« Respuesta #2 en: 28 Agosto 2021, 05:33 am »

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.
« Última modificación: 28 Agosto 2021, 05:37 am por Locura_23 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines