Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] funzionamento puntatori di puntatori

    Allora non riesco proprio a capire come funziona un puntatore di puntatore.

    Ad esempio se io ho:


    int **a,b=5,c=4;

    *a=&b;
    **a=&c;

    allora cosa succede di preciso? Viene modificato il valore di b?


    Se qualcuno può aiutarmi mi farebbe un favore enorme Anche perchè non riesco proprio a capirli

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    int **a,b=5,c=4;

    *a=&b;
    **a=&c;
    **a è il valore della variabile a cui punta, tu l' hai fatta puntare a b,quindi **a vale b, *a è l' indirizzo di b.
    a è l' indirizzo della cella di memoria in cui è contenuto l' indirizzo di b come valore.
    L' assegnazione:
    codice:
    **a=&c;
    Non è valida,perchè **a è un valore,un indirizzo è un valore esadecimale, mentre se a è un intero ti segna errore o avviso perchè con questa assegnazione si aspetta un valore intero.

    Ti faccio un esempio su come usare il puntatore del puntatore.
    Ad esempio scrivo:

    codice:
    char **array;
    Adesso ho un puntatore a puntatore,che per adesso è vuoto.
    Per iniziare a fare le assegnazioni devo prima allocargli della memoria,se voglio 5 puntatori posso dichiarare:

    codice:
    array=(char**)calloc(5,sizeof(char*));
    Allora adesso ho lo spazio per contenere 5 puntatori.
    Facciamo finta che io ho 5 stringhe già inizializzate:

    codice:
    char a[]="ciao",b[]="come",c[]="stai",d[]="?",e[]="ciao";
    Questi 5 puntatori li posso usare per farli puntare a queste stringhe:

    codice:
    array[0]=&a;
    array[1]=&b;
    array[2]=&c;
    array[3]=&d;
    array[4]=&e;
    Oppure posso usarli per creare stringhe dinamiche,della misura che voglio:

    codice:
    array[0]=(char*)calloc(5,sizeof(char));
    strcpy(array[0],"ciao");
    ......
    array[3]=(char*)calloc(2,sizeof(char));
    strcpy(array[3],"?");
    ....
    Posso anche riallocare l' array di puntatori,un puntatore a puntatore non è altro che un array di puntatore,una collezione di puntatori che posso usare fìper farli puntare ciascuno a un suo indirizzo a mio piacimento.
    Il che equivale a una matrice non regolare di caratteri del tipo:

    codice:
    ciao
    come
    stai
    ?
    ciao
    Come vedi non è regolare,puoi anche creare il puntatore del puntatore del puntatore se hai fegato

  3. #3
    Tutto molto giusto, ma credo che sia sbagliato questo:


    Originariamente inviato da ramy89
    codice:
    array[0]=&a;
    array[1]=&b;
    array[2]=&c;
    array[3]=&d;
    array[4]=&e;

    a, b, c, d, e sono già puntatori per cui se tu vuoi assegnarli in quanto tali, o fai:

    codice:
    array[0] = &a[0];
    oppure fai:

    codice:
    array[0] = a;
    che sono poi equivalenti come scritture!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    puoi anche creare il puntatore del puntatore del puntatore se hai fegato
    Ti suggerisco come interessante esercizio l'allocazione dinamica della memoria per una matrice tridimensionale gestita come puntatore triplo

    Comunque eseguendo queste righe di codice

    codice:
      int **a,b=5,c=4;
    
      *a=&b;
      **a=&c;
    potrebbe verificarsi un segfault perché non c'è spazio allocato né per *a né per **a, quindi entrambe le assegnazioni possono generare un errore di accesso alla memoria.

    Propongo un esempio forse più sensato:

    codice:
    #include <stdio.h>
    
    int main(void)
    {
        int **a = NULL, *b = NULL, c = 4;
    
        a = &b;
        b = &c;
    
        printf("Variabile a\nIndirizzo: %p\nContenuto: %p\n\n", (void *) &a, (void *) a);
        printf("Variabile b\nIndirizzo: %p\nContenuto: %p\n\n", (void *) &b, (void *) b);
        printf("Variabile c\nIndirizzo: %p\nContenuto: %d\n\n", (void *) &c, c);
    
    
        return 0;
    }
    Che può dare come possibile output:

    codice:
    Variabile a
    Indirizzo: 0xbfd5a21c
    Contenuto: 0xbfd5a218
    
    Variabile b
    Indirizzo: 0xbfd5a218
    Contenuto: 0xbfd5a214
    
    Variabile c
    Indirizzo: 0xbfd5a214
    Contenuto: 4
    In sostanza in memoria c'è questa situazione

    codice:
          Variabile a                      Variabile b                     Variabile c
    +---------------------+          +---------------------+          +---------------------+
    |Indirizzo: 0xbfd5a21c| -------> |Indirizzo: 0xbfd5a218| -------> |Indirizzo: 0xbfd5a214|
    |Contenuto: 0xbfd5a218|          |Contenuto: 0xbfd5a214|          |Contenuto:     4     |
    +---------------------+          +---------------------+          +---------------------+
    every day above ground is a good one

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ormai sto già iniziando a dimenticarmi, il massimo che ho fatto è l' esercizio con l' array di stringhe e la calcolatrice.
    Provo comunque a farlo poi apro un altro thread.

  6. #6
    Grazie mille

    Provo a ragionarci un po sopra

  7. #7

    Re: [C] funzionamento puntatori di puntatori

    Originariamente inviato da jackdispade
    Allora non riesco proprio a capire come funziona un puntatore di puntatore.

    Ad esempio se io ho:


    int **a,b=5,c=4;

    *a=&b;
    **a=&c;

    allora cosa succede di preciso? Viene modificato il valore di b?


    Se qualcuno può aiutarmi mi farebbe un favore enorme Anche perchè non riesco proprio a capirli
    nella fattispecie significa che stai programmando male in C, ed in C++ manco te lo farebbe compilare:
    codice:
    /*
    $ gcc main.c 
    main.c: In function ‘main’:
    main.c:16: warning: assignment makes integer from pointer without a cast
    
    $ g++ main.cpp 
    main.cpp: In function ‘int main()’:
    main.cpp:16: error: invalid conversion from ‘int*’ to ‘int’
    
    */
    
    int main (void){
    	int **a,b=5,c=4;
    	
    	*a=&b;
    	**a=&c;
    	return 0;
    }
    ;-)

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: Re: [C] funzionamento puntatori di puntatori

    Originariamente inviato da MacApp
    nella fattispecie significa che stai programmando male in C, ed in C++ manco te lo farebbe compilare:
    Ed è anche meglio che non venga eseguito visto che darebbe un segfault.
    every day above ground is a good one

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 © 2025 vBulletin Solutions, Inc. All rights reserved.