Domanda puntatori c++

di il
13 risposte

Domanda puntatori c++

Salve a tutti, ho un dubbio nei puntatori.
Allora ho questo listato:

int main (int argc, const char * argv[])

   char* a;
   
   a="prova";
    
    cout<<&a<<","<<&a[0]<<endl;
    
   
    return 0;
}
nella stampa finale , vorrei visualizzare l'indirizzo del puntatore a, e fin qui va tutto bene, però vorrei anche visualizzare l'indirizzo del primo carattere (in questo caso 'p') il problema è che non mi visualizza l'indirizzo ma la parola "prova"; com'è possibile?
Se vi può servire come ambiente di sviluppo uso Xcode( se è un problema di compilatore, ma non penso ,credo più sia un problema mio)

13 Risposte

  • Re: Domanda puntatori c++

    Ciao dna_programmer,
    scrivi così:
    
     cout << &a << "," << &a[0] << (void*)a << endl;
    
    Allora lavori su Mac! Per caso fai qualcosa anche per iOS?
  • Re: Domanda puntatori c++

    Ciao, per adesso no, infatti stavo vedendo qualche libro per objective-c per cocoa.

    Perché bisogna fare un cast per visualizzare l'indirizzo?
  • Re: Domanda puntatori c++

    L' operatore '<<' è overloadato (si dice cosi?) per i vari tipi, significa che quello che scrive dipende dal tipo che gli passi. Il comportamento quando gli passi il tipo char* è quello di scrivere la stringa a cui sta puntando, quando invece gli passi un void* non trova niente di meglio da fare che scrivere l' indirizzo a cui sta puntando.
  • Re: Domanda puntatori c++

    Quindi in pratica con *char l'operatore << visualizza:

    1) con &a l'indirizzo della variabile puntata da a(in questo caso "prova")

    2) con (void*)a sempre l'indirizzo della variabile puntata? non capisco
  • Re: Domanda puntatori c++

    barba59 ha scritto:


    L' operatore '<<' è overloadato (si dice cosi?)
    Sovraccaricato (con incertezza sulla doppia c)
  • Re: Domanda puntatori c++

    Ciao shodan,
    e si, sovraccaricato è il termine giusto! (pure la doppia c)

    Ciao dna_programmer,
    un puntatore è una variable come le altre e ha un suo indirizzo, poi essendo un puntatore il suo contenuto è un altro indirizzo.

    Riassumendo:
    1) &a è l' indirizzo del puntatore 'a' (a è una variabile locale e ha un suo indirizzo)
    2) a è un puntatore e contiene un indirizzo per vedere questo valore però devi scrivere (void*)a perchè l' operatore '<<' e sovraccaricato in maniera particolare per i char*.
  • Re: Domanda puntatori c++

    A ok, una cosa, facendo una prova ho scritto questo codice:
    
    
       a="parola";
        
      cout<<"Indirizzo puntatore a :"<<&a<<endl;
        
        cout<<"Valore puntato da a:"<<(void*)a<<endl;
        
        cout<<"Valore puntato da a:"<<(void*)a[0]<<endl;
    
    
    
    solo che non ho ricevuto i valori che mi aspettavo; mi spiego meglio:
    nelle ultime due istruzioni non avrei dovuti ricevere gli stessi risultati(indirizzi di memoria)?
    Dico questo perché nella penultima istruzione vado a visualizzare la variabile che punta il puntatore "a", mentre nella seconda vado a visualizzare l'indirizzo di a[0] , ecco non dovrebbe essere lo stesso visto che nei vettori il puntatore punta al primo carattere?

    Non so se mi sono spiegato bene
  • Re: Domanda puntatori c++

    Ciao dna_programmer,
    nell' ultima riga prendi il contenuto di a[0] che è un char (supponiamo sia il carattere 'p') e lo converti in (void*), cioè vuoi convertire un carattere in un puntatore (che è alla fine un numero) quindi vedrai 112 (che è il valore ascii di 'p'), probabilmente verra scritto in esadecimale come 0000070.
  • Re: Domanda puntatori c++

    A ok quindi se vorrei prendere l'indirizzo del primo carattere come dovrei fare?
    
    
    cout<<"Valore puntato da a:"<<&(void*)a[0]<<endl;
    
    
    cosi'?
  • Re: Domanda puntatori c++

    No quello che hai scritto non si compila, devi scrivere: (void*)&a[0]
    
    cout << a << " " << (void*)a << " " << (void*)&a[0] << endl;
    
    Ovviamente l' indirizzo di a[0] e l' indirizzo a cui punta 'a' sono lo stesso valore, ovvero l' indirizzo a cui inizia la stringa.
  • Re: Domanda puntatori c++

    A ok .solo una cosa, non mi é ben chiaro cosa vuol dire puntatore di tipo void, una delle regole dei puntatori é proprio quella di avere un tipo ben definito, con il fatto del void si annullerebbe tutto quello detto precedentemente
  • Re: Domanda puntatori c++

    Effettivamente il void* è un puntatore senza nessun tipo, è qualcosa che punta a una certa zona di memoria ma non fornisce informazioni su quello che vi è contenuto. Dato che non si sa a cosa punta non si puo deferenziarlo (non si può scrivere *p) e non si puo usare l' arirtmetica dei puntatori (p + 1 non è consentito).

    Comunque lo si usa, a volte ti serve di riferirti a delle zone di memoria generiche, oppure hai dei blocchi che contengono dati non omogenei. Ovviamente se vuoi estrarre qualcosa dalla memoria lo devi per forza convertire.
  • Re: Domanda puntatori c++

    A ok tutto chiaro.
    Grazie ancora barba!
Devi accedere o registrarti per scrivere nel forum
13 risposte