Puntatori a stringhe

di il
10 risposte

Puntatori a stringhe

Salve a tutti, ho provato a fare questo:


string * x=new string;

x="prova";

Solo che non ho capito il perché mi da errore all'ultima riga, mentre ad esempio in un altro linguaggio(objective-c) me lo permette. Cioè in pratica ho visto che in c++ con i puntatori a stringhe non puoi farci nulla(o forse sono io che non ho capito molto bene).Grazie mille in anticipo per la spiegazione

10 Risposte

  • Re: Puntatori a stringhe

    Perche non hai capito come funziona la classe string
    esempi
    
    string x;
    x = "prova";
    
    oppure
    string *x = new string;
    *x = "prova";
    delete x;
    
    da notare che non ha senso parlare di puntatori a string in quanto la classe string gestisce da sola la memoria.
  • Re: Puntatori a stringhe

    Perché se devo modificare il puntatore a stringhe devo mettere:
    
    *x="prova"
    
    e non
    
    x="prova"
    
  • Re: Puntatori a stringhe

    Perche string è una classe non un array di caratteri. Ciò che tu fai in objective-c non si applica in C++. Un puntatore a string è raramente utilizzato quindi continua ad usare lo stack e non il heap. Usare string * non ha senso in C++ se non in contesti strani.
    Poi non stai modificando il puntatore ma stai assegnando alla stringa puntata da x il valore "prova"
  • Re: Puntatori a stringhe

    E perché con i puntatori a char posso fare questo
    
    char * x=new char;
    x="prova";
    
    cioè così andrei a modificare il puntatore
  • Re: Puntatori a stringhe

    Lo puoi fare perché il sistema assegna un puntatore all'array di caratteri statico "prova" che poi viene assegnato a x. Nel caso della stringa (che è una classe, ricordati) non lo puoi fare perché cerchi di convertire un puntatore a char in un puntatore a string.
  • Re: Puntatori a stringhe

    Scusa me lo potresti spiegare un po' più semplice perché non ho capito molto bene.La cosa principale che non ho capito è:
    perché se con le stringhe faccio:
    
    string x;
    x = "prova";
    
    vado a modificare il puntatore(e quindi non posso farlo)

    mentre se con i char faccio:
    
    char * x=new char;
    x="prova";
    
    non vado a modificare il puntatore(e quindi posso farlo)

    Inoltre ho provato a fare:
    
    char * x=new char;
    *x="prova";
    
    e mi da errore
  • Re: Puntatori a stringhe

    La classe std::string è una classe molto complessa e devi imparare ad usarla. Tu stai applicando lo stesso principio ad un oggetto di tipo mela con un oggetto di tipo tavola. Quindi sono due cose totalmente differenti. il char è il tipo standard del ansi C, lo std::string è una classe (ribadisco classe) delle template standard. Non centra per niente il puntatore nella classe string ma i vari funzioni e gli overload che questa classe permette. Quindi se tu puoi fare
    
    std::string x;
    x = "prova";
    
    in realtà ciò che stai facendo è:
    
    creare una classe std::string di nome x;
    mettere in questa stringa dei caratteri con l'istruzione x = "prova";
    (qui entra in gioco l'overload dell'operatore = della classe string)
    come vengono inseriti questi caratteri:
    internamente la classe string calcola lo spazio necessario a contenere i caratteri, chiede al sistema  lo spazio necessario, copia internamente i caratteri. Quindi non c'è una modifica di puntatore ma una cosa molto diversa come vedi.
    
    Nel secondo esempio
    
    char * x=new char;
    x="prova";
    
    qui x è un puntatore a char e quindi può contenere solo un indirizzo dove risiede un carattere.
    x = "prova";
    A x li viene assegnato l'indirizzo dove sta il carattere 'p' nell'array di caratteri "prova" questo perche l'indirizzo di 'p' equivale all'indirizzo del primo carattere dell'array di caratteri "prova"

    Terzo esempio
    
    char * x=new char;
    *x="prova";
    
    *x in questo caso è un carattere perche x è un puntatore a char, forse questo passaggio a te non ti è chiaro.
    Non puoi assegnare a un carattere un array intero di caratteri, da cui l'errore.
  • Re: Puntatori a stringhe

    A ok, quindi la differenza sta nell'overload degli operatori della classe string, non c'entra niente il fatto che uno è char e l'altro string; quindi ipotizzando che la classe string non avesse gli overload degli operatori si comporterebbe nello stesso modo dei char, ho capito bene?

    Per quando riguarda il terzo esempio non ho capito bene, sopratutto la frase:
    
    Non puoi assegnare a un carattere un array intero di caratteri, da cui l'errore.
    
  • Re: Puntatori a stringhe

    La classe string ha un infinita di funzioni per manipolare i caratteri non ha niente a che fare col char *.
    Il terzo esempio è errato perche non puoi assegnare un array di caratteri ad un unico carattere cosa che stai cercando di fare. L'aritmetica dei puntatori ci insegna che char *x è identico a x[0] ed è quindi un carattere unico. Ecco perche la tua assegnazione fa arrabiare il compilatore.
  • Re: Puntatori a stringhe

    A ecco, ok .ti ringrazio per la spiegazione e la disponibilità.
    Ciao
Devi accedere o registrarti per scrivere nel forum
10 risposte