2009-09-18 25 views
15

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

const char *someArray 

Questa è la definizione di un puntatore che indica i tipi di char e il modificatore const significa che i valori memorizzati in someArray non possono essere cambiati. Tuttavia, che cosa significa questo?

char * const array 

E 'questo un modo alternativo di specificare un parametro che è un puntatore char a un array di nome "allineamento" che è const e non può essere modificato?

Infine, cosa significa questa combinazione significa:

const char * const s2 

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

risposta

41

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

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

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

+0

Grazie per la grande sintesi! –

+0

Non hai idea di quante volte ho controllato questa risposta ... LOL! Grazie molto! – kazbeel

3
char * const array; 

Significa che il puntatore è costante. Inoltre,

const * const char array; 

significa un puntatore costante alla memoria costante.

7

Si dovrebbe provare cdecl:

 
~ $ cdecl 
Type `help' or `?' for help 
cdecl> explain const char *someArray 
declare someArray as pointer to const char 
cdecl> explain char * const someArray 
declare someArray as const pointer to char 
cdecl> explain const char * const s2 
declare s2 as const pointer to const char 
cdecl> 
+0

Si tratta di un'utilità solo per Linux? –

+0

Non ho mai provato a usarlo diversamente, ma sono sicuro che è disponibile per altri sistemi operativi, come parte di cygwin o altro. –

+0

Hmm. Ok, vedrò se c'è una build per Mac o se viene fornito con XCode. Grazie! –

13
//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 

}

+0

Esempi di codice fantastico - grazie! –

0

Ripetendo ciò che ha scritto altri utenti, ma voglio fornire un contesto.

Prendete questi 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 è invariata dopo la chiamata di funzione.


consideri la funzione strcpy()

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

Una possibile implementazione è

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

Questa implementazione cambia sia dest e src all'interno solo la funzione. Fare uno dei puntatori (o entrambi) const non otterrebbe nulla per la funzione strcpy() o per il codice chiamante.