2009-09-18 21 views
15

Ich gehe über C und habe eine Frage bezüglich const Verwendung mit Zeigern. Ich verstehe den folgenden Code:const Verwendung mit Zeigern in C

const char *someArray 

Dieser Zeiger ist die Definition, die Arten von Zeichen Punkte und die const Modifikator bedeutet, dass die in someArray gespeicherten Werte können nicht geändert werden. Was bedeutet jedoch Folgendes?

char * const array 

Ist dies eine alternative Möglichkeit, einen Parameter anzugeben, der ein char Zeiger auf ein Feld „array“ benannt ist, die const ist und nicht geändert werden kann?

Schließlich, was diese Kombination bedeutet:

const char * const s2 

Als Referenz diese aus dem Deitel C-Programmierung Buch genommen werden in Kapitel 7 und alle diese werden als Parameter an Funktionen übergeben verwendet.

Antwort

41

const char* ist, wie Sie sagten, ein Zeiger auf ein Char, wo Sie den Wert des Char nicht ändern können (zumindest nicht durch den Zeiger (ohne die Konstanz wegwerfen)).

char* const ist ein Zeiger auf ein Zeichen, in dem Sie das Zeichen ändern können, aber Sie können den Zeiger nicht auf ein anderes Zeichen ausrichten.

const char* const ist ein konstanter Zeiger auf ein konstantes Zeichen, d. H. Sie können weder den Zeigerpunkt noch den Wert des Verweises ändern.

+0

Danke für die tolle Zusammenfassung! –

+0

Sie haben keine Ahnung, wie oft ich diese Antwort überprüft habe ... LOL! Danke vielmals! – kazbeel

3
char * const array; 

Dies bedeutet, dass der Zeiger konstant ist. Auch

const * const char array; 

bedeutet einen konstanten Zeiger auf konstante Speicher.

7

Sie sollten cdecl ausprobieren:

 
~ $ 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

Ist dies ein Linux-Only-Dienstprogramm? –

+0

Ich habe nie versucht, es anders zu benutzen, aber ich bin mir sicher, dass es für andere Betriebssysteme als Teil von Cygwin oder anderweitig verfügbar ist. –

+0

Hmm. Ok, ich werde sehen, ob es einen Mac Build gibt oder ob es mit XCode kommt. Vielen Dank! –

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

Großartige Codebeispiele - Danke! –

0

wiederholen, was andere Benutzer geschrieben, aber ich will Kontext.

Nehmen Sie diese zwei Definitionen:

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 */ 
} 

machen den Zeiger selbst const, wie in der f2 Beispiel ist absolut fast sinnlos. Jeder an eine Funktion übergebene Parameter wird als Wert übergeben. Wenn die Funktion diesen Wert ändert, ändert sie nur ihre lokale Kopie und hat keine Auswirkungen auf den aufrufenden Code.

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

In jedem Fall ist buf unverändert nach dem Funktionsaufruf.


die Funktion strcpy() Betrachten

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

Eine mögliche Implementierung ist

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

Diese Implementierung ändert sich sowohl dest und src innerhalb nur die Funktion. Das Erstellen eines der Zeiger (oder beider) const würde nichts für die Funktion strcpy() oder den aufrufenden Code ergeben.