uso const con i puntatori in C

Sto andando oltre C e ho una domanda riguardante l’utilizzo const con i puntatori. Capisco il seguente codice:

 const char *someArray 

Questo sta definendo un puntatore che punta a tipi di char e il modificatore const significa che i valori memorizzati in someArray non possono essere modificati. Tuttavia, che cosa significa questo?

 char * const array 

È un modo alternativo di specificare un parametro che è un puntatore char su un array denominato “array” che è const e non può essere modificato?

Infine, cosa significa questa combinazione:

 const char * const s2 

Per riferimento, questi sono presi dal libro di programmazione Deitel C nel Capitolo 7 e tutti questi sono usati come parametri passati alle funzioni.

const char* è, come hai detto, un puntatore a un carattere, in cui non è ansible modificare il valore del char (almeno non tramite il puntatore (senza gettare la costanza di distanza)).

char* const è un puntatore a un carattere, in cui è ansible modificare il carattere, ma non è ansible impostare il puntatore su un altro carattere.

const char* const è un puntatore costante a un carattere costante, ovvero non è ansible modificare né il puntatore né il valore del puntale.

Da quale è la differenza tra const int *, const int * const, int const * :

Leggi indietro …

 int* - pointer to int int const * - pointer to const int int * const - const pointer to int int const * const - const pointer to const int 
 //pointer to a const void f1() { int i = 100; const int* pi = &i; //*pi = 200; <- won't compile pi++; } //const pointer void f2() { int i = 100; int* const pi = &i; *pi = 200; //pi++; <- won't compile } //const pointer to a const void f3() { int i = 100; const int* const pi = &i; //*pi = 200; <- won't compile //pi++; <- won't compile 

}

Dovresti provare cdecl :

 ~ $ cdecl
 Scrivi `aiuto 'o`?'  per un aiuto
 cdecl> spiega const char * someArray
 dichiara someArray come puntatore a const char
 cdecl> spiega char * const someArray
 dichiarare someArray come puntatore const sul char
 cdecl> spiega const char * const s2
 dichiarare s2 come puntatore const su const char
 cdecl>
 char * const array; 

Significa che il puntatore è costante. Anche,

 const * const char array; 

significa un puntatore costante alla memoria costante.

Ripetere ciò che hanno scritto gli altri utenti, ma voglio fornire un contesto.

Prendi queste due definizioni:

 void f1(char *ptr) { /* f1 can change the contents of the array named ptr; * and it can change what ptr points to */ } void f2(char * const ptr) { /* f2 can change the contents of the array named ptr; * but it cannot change what ptr points to */ } 

Rendere il puntatore stesso const , come nell’esempio f2, è assolutamente quasi inutile. Ogni parametro passato a una funzione viene passato per valore. Se la funzione modifica questo valore, modifica solo la sua copia locale e non ha alcun effetto sul codice chiamante.

 /* ... calling code ... */ f1(buf); f2(buf); 

In entrambi i casi, buf è invariato dopo la chiamata alla funzione.


Considera la funzione strcpy ()

 char *strcpy(char *dest, const char *src); 

Una ansible implementazione è

 char *strcpy(char *dest, const char *src) { char *bk = dest; while (*src != '\0') { *dest++ = *src++; } *dest = *src; return bk; } 

Questa implementazione modifica sia dest che src all’interno della funzione. Facendo uno dei puntatori (o entrambi) const otterrebbe nulla per la funzione strcpy () o per il codice chiamante.