Puntatore costante

di il
7 risposte

Puntatore costante

Dato il seguente codice C++ che ho trovato in rete, ho dubbi nell'interpretarlo:
void fun(char *s); // non altera la stringa
int main() {
  char const hello[] = “ciao“;
  fun(hello) // errore
  // cannot convert parameter 1 from 'const char [5]' to 'char *‘
  fun(const_cast<char *>(hello)); // OK
return 0; }
Se ben capisco la dichiarazione char const hello[] = “ciao“ o meglio la sua definizione crea un puntatore hello costante, la cui area di memoria viene riservata alla stringa ciao.
Se non capisco male il nome di un array è sempre dichiarato come puntatore costante quindi non è necessario esplicitarlo con char const hello[] o sbaglio? Primo dubbio.
Detto questo perchè il compilatore restituisce errore quando chiamo fun(hello)?
Durante il passaggio del parametro attuale 'hello' dovrei far altro che copiare l'indirizzo di memoria contenuto in hello nel puntatore s, non sto cambiando il valore di p. Giusto? Perchè il compilatore da errore ?Questo è il secondo dubbio

Per la seconda domanda provo a rispondermi da solo:
non c'e' coerenza tra tipo argomento attuale e formale, il primo è un puntatore costante a char mentre il secondo è soltanto un puntatore a char, provo a lanciarmi e affermo che il compilatore non avrebbe restituito errori se avessi avuto una situazione inversa cioè se il const fosse stato presente nel parametro formale. Corretto?

7 Risposte

  • Re: Puntatore costante

    Char const hello[] = “ciao“; non crea nessun puntatore costante. Riserva un blocco di memoria di 4 + 1 byte per contenere "ciao\0", e a questo blocco verrà assegnato l'identificatore hello. Il modificatore const non permetterà di modificare i singoli elementi dell'array. Quindi un'istruzione tipo hello[3] = 'r' sarà bloccata dal compilatore.

    Durante la chiamata a fun, hello decade in un puntatore al primo elemento dell'array, ovvero alla lettera 'c'. Il contenuto puntato da questo puntatore è costante, dato che hello[] è dichiarato come blocco di memoria costante, mentre il puntatore *s di fun non è dichiarato come puntatore a contenuto costante e quindi ricevi errore. A parti invertite non ci sarebbero stati problemi come hai giustamente pensato.

    L'ultima chiamata di fun usa una coercizione che elimina la constness dal contenuto puntato dal puntatore hello, che ti ricordo è derivato da un "decadimento" implicito da blocco di memoria a puntatore al primo elemento.
  • Re: Puntatore costante

    No, non mi torna per niente.
    La teoria a mio avviso dice tutt'altro.
    Se ho un puntatore del tipo:
    int v;
    const int* p=&v; 
    significa che non posso modificare v utilizzando il puntatore p, ma posso modificare v utilizzando altri puntatori o direttamente.

    diversamente se ho
    int v;
    int* const p=&v; 
    significa che il puntatore p è una costante e non posso modificarne il contenuto ragion per cui deve essere subito inizializzato.

    Quindi questa affermazione non mi convince:
    Char const hello[] = “ciao“; non crea nessun puntatore costante
  • Re: Puntatore costante

    Puntatori ed array sono due cose diverse. Ti invito a visionare la sezione 6 delle C FAQ http://c-faq.com/aryptr/index.htm
    La domanda 6.9 fa proprio al caso tuo.
  • Re: Puntatore costante

    Ma! Non sono convinto, per quel che ho capito l'identificatore di un array è sempre un puntatore costante.
    Dico che la sintassi
    tipo puntatore const identificatore
    si legge in quel modo e quindi si applica anche agli array. Per me in const sta a significare che è un puntatore costante il cui indirizzo non può variare, guarda questo link:

    http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/22Puntconst.html
  • Re: Puntatore costante

    Conosco questo sito, in alcune parti non è esatto. L'identificatore di un array NON è un puntatore costante e array e puntatori sono cose diverse. Non sbagli nelle tue conoscenze in merito ai puntatori e al const applicato ad essi, ma alcune regole non valgono per gli array.
    Il sito che ti ho linkato è un'autorità sull'argomento.
  • Re: Puntatore costante

    Stavo rileggendo...

    jfet ha scritto:


    Char const hello[] = “ciao“; non crea nessun puntatore costante. Riserva un blocco di memoria di 4 + 1 byte per contenere "ciao\0",
    in effetti mi sono spiegato malissimo dicendo che crea un puntatore costante, ovviamente riserva un'area di memoria per contenere gli elementi ma l'identificatore hello non rappresenta un puntatore?
    Il modificatore const non permetterà di modificare i singoli elementi dell'array. Quindi un'istruzione tipo hello[3] = 'r' sarà bloccata dal compilatore.
    Ma forse non è che ti sbagli con const Char hello[] = “ciao“ ?
    Se non fosse così allora nel caso dell'array qual è la differenza con Char const hello[] = “ciao“
  • Re: Puntatore costante

    char * p                                    = data;    non-const pointer, non-const data
    const char *p / char const * p              = data;    non-const pointer, const data
    char * const p                              = data;    const pointer,     non-const data
    const char * const p / char const * const p = data;    const pointer,     const data
    Lo specificatore const si riferisce al tipo alla sua sinistra o a quello alla sua destra se si trova all'inizio della dichiarazione.
    Questo significa che const char s[] = "ciao" e char const s[] = "ciao" sono equivalenti e rappresentano un array con elementi costanti.

    Array e puntatori sono entità distinte, ma escluso alcuni casi particolari (tipo nell'utilizzo di sizeof) l'identificatore di un array viene convertito in un puntatore costante che punta al primo elemento dell'array.
Devi accedere o registrarti per scrivere nel forum
7 risposte