Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: benedetti puntatori

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56

    benedetti puntatori

    Leggo il forum e so di essere in buona (cattiva) compagnia con chi
    ha problemi coi puntatori...ho creduto di capirli tanta volte e altrettante
    volte non ne sono uscito.


    codice:
    
    int main(void) {
    
            
             
            
           char *P[100] = {"gennaio", "febbraio",
                        "marzo", "aprile",
                        "", ""};
    
    
         char *A ;
    
         A = P[3]  ;
    
        char **B = &A ;
    
          
    
      char * E [5] ;
    
      E[0] = (char*)B ;
    
      printf("%s\n",  A);
    
      printf("%s\n",  E[0]);
    Mi stampa correttamente A
    e una porcheria per E[0] ....Perchè ?
    Grazie.



    aprile
    '��)�*��PT������`*��PT��
    [Press Enter to close window]

  2. #2
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    B è un puntatore doppio, quindi devi accedervi tramite un indice
    codice:
    	E[0] = B[0] ;
    oppure
    codice:
    	E[0] = (*B) ;
    il cast non serve

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Originariamente inviato da SamIam
    B è un puntatore doppio, quindi devi accedervi tramite un indice
    codice:
    	E[0] = B[0] ;
    oppure
    codice:
    	E[0] = (*B) ;
    il cast non serve
    Grazie ,funziona....Quindi col crescere di livello dei puntatori nascono dei livelli
    come fossero vettori di puntatori ?

  4. #4
    Si, ma più correttamente si dice "puntatori che a sua volta puntano a puntatori".
    Esempio:
    char** a;

    a è un doppio puntatore, e il compilatore sa che a contiene un indirizzo che punta a un altro indirizzo che a sua volta punta a un'altra zona di memoria che contiene un char.
    codice:
    char **B = &A ;
    char * E [5] ;
    E[0] = *B ;
    B è un doppio puntatore, e fin qui ci siamo.


    Strano a dirlo (non tanto però), anche E è un doppio puntatore, perché sappiamo che un array in C non è altro che un puntatore al primo elemento dell'array.

    Solo che c'è una piccola ma sostanziale differenza tra queste due dichiarazioni:
    char **B;
    char * E [5] ;

    La prima semplicemente dichiara un doppio puntatore, mentre la seconda alloca sullo stack 5 puntatori a char. Proprio per il fatto che alloca anche sullo stack, la seconda dichiarazione non è molto indicata quando dovrai allocare memoria dinamicamente (per esempio con malloc())

    Spero di essertti stato utile

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: benedetti puntatori

    L' ho corretto considerando anche l' indentazione, che era un casino:

    codice:
    int main(void) 
    {
        char *P[] = {"gennaio", "febbraio","marzo", "aprile", "", ""};
        char *A ;
        char **B;
        char * E [5] ;
        A = P[3]  ;
        B = &A ;
        E[0] = B ;
        printf("%s\n",  A);
        printf("%s\n",  *E[0]);
        return 0;
    }
    Se P si trova all' indirizzo mille, ciò non ha nessun legame con le stringhe che si trovano in P[0],...,P[5].
    Se la stringa P[0] si trova all' indirizzo 2000 nell' area di sola lettura, P contiene l'indirizzo 2000 come valore, ma il puntatore non è memorizzato all' indirizzo 2000.
    Deferenziando E[0], che contiene l' indirizzo in cui è contenuto il puntatore che punta alla stringa P[3], ottieni proprio l' indirizzo della stringa P[3].

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da ardito86
    Si, ma più correttamente si dice "puntatori che a sua volta puntano a puntatori".
    E' un vettore di puntatori, non un puntatore a puntatore.
    La differenza sostanziale è proprio quella che hai detto te, cioè che è un vettore di puntatori già allocati nello stack.
    Proprio perchè il vettore di puntatori è già allocato, non è possibile farlo puntare a un' altra area di memoria.
    Se invece era un puntatore a puntatore, ciò era possibile.
    Ad esempio:
    codice:
    char** a; // puntatore a puntatore
    char* b[5]; // vettore di puntatori
    a=(char**)malloc(5*sizeof(char*));
    a[0]=(char*)"ciao";
    b=a;  // illegale, proprio perchè b non è un puntatore a puntatore
             // ma un array di puntatori, l' array è statico

  7. #7
    Intendevo che riguardo la "grammatica "del linguaggio, è un doppio puntatore. Che poi il compilatore tenga conto che è stata allocata memoria sullo stack è una questione aggiuntiva ...ma

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Non è un doppio puntatore, è un indirizzo.Il puntatore è assegnabile.
    b non è assegnabile per cui non è un puntatore.

  9. #9
    Originariamente inviato da ramy89
    Non è un doppio puntatore, è un indirizzo.Il puntatore è assegnabile.
    b non è assegnabile per cui non è un puntatore.
    Mi dispiace contraddirti...ma un vettore è un puntatore.

    int a[3];

    a è un puntatore.

    Il fatto che non sia assegnabile è che, in questo esempio, il compilatore lo considera come un const int*. Ma è un puntatore. Se scrivi in C++:

    cout << a;

    non ti stamperà il vettore m un numeraccio esadecimale che non è altro che l'indirizzo in memoria a cui punta.

    int *b;
    b = a; //lecito

    Quindi se io dichiarassi

    int* const c;

    e facessi:
    c=b; //illecito

    siccome c non è assegnabile allora non è un puntatore?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Continua lo scioglilingua sui puntatori ...e alla fine si è in dubbio su un po' di cose.

    char *A ; // è un puntatore

    char **B = &A ; // è un puntatore di un puntatore

    char ***C = &B ; // è un puntatore di un puntatore di un puntatore

    Char ****D = &C ; // è un puntatore di un puntatore di un puntatore di un puntatore

    E cosi all' infinito ?

    forse no ...la stringa puntata da A puo essere vista da B solo con

    E[0] = (*B) ; oppure E[0] = B[0] ;

    sempre la stringa puntata da A posso vederla da C solo con E[1] = (**C) ;

    insomma con espressioni strane , mi sembra.....

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.