Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C] Puntatori.....

  1. #1

    [C] Puntatori.....

    Ciao a tutti, scusate l'intrusione ma ho bisogno di aiuto!
    Sto studiando C per darmi una materia all'università, diciamo che è abbastanza facile o cmq ho gia dimestichezza con il programma!
    Il mio problema inizia quando devo capire i puntatori... qualcuno mi può dare 1 mano a capirne la vera utilità?
    Ho letto un programma ( se volete lo metto, nn è lungo ) dove usa i puntatori, e mi è venuto veramente tanto difficile capire la loro funzione!
    Pensate di potermi dare 1 mano? Anche con esempi stupidi!

  2. #2
    Beh, intanto potresti cominciare con il postare quel programma e quella funzione, almeno ne discutiamo su.. cmq i puntatori sono uno dei pilastri fondamentali per un buon programmatore C. Ci si può gestire direttamente la memoria...

    Piccolo esempio:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
        char array[5] = "Ciao"; // dichiaro un array di 5 bytes
        char *ptr = array; // ptr ora contiene l'indirizzo della prima componente di "array"
        printf("%c\n", *ptr); // stampo la prima componente *(ptr+0), equivalente ad array[0]
        printf("%c\n", *(ptr+1)); // stampo il contenuto dell'indirizzo puntato da (ptr+1)
        printf("%X\n", (ptr+1)); // stampo l'indirizzo di (ptr+1) (equivalente alla printf sotto)
        printf("%X\n", &array[1]); // stampo l'indirizzo di array[1] (equivalente alla printf sopra)
        *(ptr+1)=*(ptr+2); // inverto
        *(ptr+2)='i'; // e....
        
        printf("%s\n", ptr);
        system("pause");
        
        return 0;
    }

    Risultato:
    codice:
    C
    i
    22FF61
    22FF61
    Caio
    Premere un tasto per continuare . . .
    -Xant
    [White Thoughts - What Happens Inside Us]
    [myxperiments projects and contacts page]

  3. #3
    Ecco il codice:

    codice:
    #include <stdio.h>
    #include <string.h>
    
    #define MAXELE 30
    #define DIM 31
    #define MENU 0
    #define INS 1
    #define CAN 2
    #define RIC 3
    #define VIS 4
    #define OUT 100
    
    /* Semplice struttura che modella una persona */
    
    struct per {
           
           char cognome[DIM];   /* La dimensione l'abbiamo dichiarata all'inizio con #define DIM 31 */
           char nome[DIM];
           char ind[DIM];
           int eta;
           
           };
           
    /*  Vettore persone */
    
    struct per anag[MAXELE]; /* Dovrebbe stabilire il numero massimo di elementi e quindi persone */
    
    /* Numero elementi allocati nel vettore anag */
    
    int index = 0;
    
    int menPer(void);
    int insPer(int);
    struct per * cerPer(char *,char *, int);  /* Capita la funzione, perchè mette *? */
    void eliPer(struct per *);   /* eliPer si riferisce ad una strutta, perchè deve eliminare tutto */
    void canPer(void);           /* Questa funzione invece la definiamo noi dopo */
    void ricPer(void);           /* Questa funzione invece la definiamo noi dopo */
    void visPer(struct per *);   /* visPer si riferisce ad una strutta, perchè deve eliminare tutto */
    void visAnagrafe(void);
    
    /* Presenta il menu e lancia la funzione a scelta */
    
    int main()
    {
         
         int scelta = MENU;
         
         while(scelta!=OUT){
         switch(scelta){
                       
                       case MENU:
                            scelta = menPer();
                            if(scelta == MENU)
                              scelta = OUT;
                              break;
                              
                       case INS:
                            index = insPer(index);
                            scelta = MENU;
                            break;
                            
                       case CAN:
                            canPer();
                            scelta = MENU;
                            break;
                            
                       case RIC:
                            ricPer();
                            scelta = MENU;
                            break;
                            
                       case VIS:
                            visAnagrafe();
                            scelta = MENU;
                            break;
                       
                       }
                       }
                       }
    
              
    /*  MENU */
    
    int menPer(void)
    {
        int scelta;
        char invio;
        int vero = 1;
        
        while(vero){
                    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                    printf("\t\t\t ANAGRAFE");
                    printf("\n\n\n\t\t\t 1. Immissione Persona");
                    printf("\n\n\n\t\t\t 2. Cancellazione Persona");
                    printf("\n\n\n\t\t\t 3. Ricerca Persona");
                    printf("\n\n\n\t\t\t 4. Visualizza Anagrafe");
                    printf("\n\n\n\t\t\t 0. Fine");
                    printf("\n\n\n\t\t\t\t\t. Scegliere una opzione: ");
                    scanf("%d", &scelta);
                    scanf("%c", &invio);
                    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                    
                    switch(scelta){
                                   
                                   case 0:
                                   case 1:
                                   case 2:
                                   case 3:
                                   case 4:
                                        return(scelta);
                                        default:
                                          break;
                                          }
                                          }
                                    
                                    return(0);
                                    }
                     
    /* Inserisce persona nell'anagrafe */
    
    int insPer(int pos)
    {
        char invio;
        if(pos>=MAXELE){
           printf(" Non si possono inserire altri nomi ");
           scanf("%c",&invio);
           return(pos);
            }
        
        printf("\n\tINSERIMENTO PERSONA");   /* Da dove e' uscito fuori pos? */
        printf("\n\t\t------------\n\n");
        printf("\nCognome: ");
        gets(anag[pos].cognome);
        printf("\nNome: ");
        gets(anag[pos].nome);
        printf("\nIndirizzo: ");
        gets(anag[pos].ind);
        printf("\nEta':");
        scanf("%d", &anag[pos].eta);
        scanf("%c", &invio);
        pos++;
        return(pos);
        }
        
        /* Cancella persona dall'anagrafe, se presente */
        
        void canPer(void)
        {
             char pausa;
             char cognome[DIM], nome[DIM];
             int eta;
             struct per *ps;          /* Utilizza un puntatore */
             
             printf("\n\t\t CANCELLA PERSONA");
             printf("\n\t\t------\n\n");
             printf("\nCognome:");
             gets(cognome);           /* Perchè qua non compare anag[pos] ? */
             printf("\nNome: ");
             gets(nome);
             printf("\nEta':");
             scanf("%d",&eta);
             scanf("%c",&pausa);
             
        /* Invoca ricerca persona */
             
             ps = cerPer(cognome, nome, eta);
             if(ps == NULL){
                   printf("\nPersona non presente in anagrafe");
                   scanf("%c",&pausa);
                   return;             /* A cosa serve questo return e perchè lo usa spesso? */
                   }
        
        /* Invoca visualizza persona */
        visPer(ps);
        printf("\nConfermi cancellazione? (S/N)");
        scanf("%c", &pausa);
        if(pausa=='S' || pausa=='s'){
                      eliPer(ps);
                      return;         
             }         
             }
             
        /*  Elimina persona dall'anagrafe */
        
        void eliPer(struct per *p)
        {
             strcpy(p->cognome, "");
             strcpy(p->nome, "");
             strcpy(p->ind, "");
             p->eta = 0;
              }
              
        /* Ricerca persona se presente nell'anagrafe */
        
        void ricPer(void)
        {
             char pausa;
             char cognome[DIM], nome[DIM];
             int eta;
             struct per *ps;
        
        /* Inserimento dati persona da ricercare */
           
             printf("\n\t RICERCA PERSONA");
             printf("\n\t\t-------\n\n");
             printf("\nCognome:");
             gets(cognome);
             printf("\nNome:");
             gets(nome);
             printf("\nEta':");
             scanf("%d",&eta);
             scanf("%c",&pausa);
        
        /* Invoca la funzione di scansione sequenziale */
         
             ps = cerPer(cognome, nome, eta);
             if(ps == NULL){
                   
                   printf("\nPersona non presente in anagrafe");
                   scanf("%c", &pausa);
                   return;
                   }
                   
             visPer(ps);
             scanf("%c", &pausa);
             }
             
         /* Scansione sequenziale del vettore anag alla ricerca di una persona che abbia determinati cognome, nome ed età */
         
         struct per *cerPer(char *cg,char *nm,int et)
         {
         int i;
         for (i=0; i<=index; i++){
            if(strcmp(cg, anag[i].cognome) == 0)
             if(strcmp(nm, anag[i].nome) == 0)
              if(et == anag[i].eta)
                return(&anag[i]);
                }
             
             return(NULL);
             }
             
         /* Visualizza persona */
         
            void visPer(struct per *p)
            {
                 printf("\n\n------------------\n");
                 printf("\n\t\tCognome: %s", p->cognome);
                 printf("\n\t\tNome: %s", p->nome);
                 printf("\n\t\tIndirizzo: %s", p->ind);
                 printf("\n\t\tEta': %d", p->eta);
                 printf("\n\n------------------\n");
                 }
         
         /* Visualizza l'anagrafe completa */
         
            void visAnagrafe(void)
            {
                 int i; char pausa;
                 struct per *ps = &anag[0];
                 for(i=0; i<index; i++){
                          visPer(ps++);
                          scanf("%c",&pausa);
                          }
    }

  4. #4
    Quali punti ti sono poco chiari?

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    hai un array di strutture. Ecco a cosa servono i puntatori. Questi dati sono contenuti in memoria(ram) e per accedere alle strutture lo fai con i puntatori. La funzione:

    struct per * cerPer(char *,char *, int); /* Capita la funzione, perchè mette *? */

    ritorna un puntatore a una struttura, in questo modo non si duplicano i dati, e la funzione che richiama cerPer avrà un puntatore a una struttura. Cmq ricordati che c'è analogia stretta fra array e puntatori

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.