366 Stimmen

Was ist der Unterschied zwischen char * const und const char *?

Was ist der Unterschied zwischen:

char * const 

und

const char *

459voto

workmad3 Punkte 24502

Der Unterschied besteht darin, dass const char * ist ein Zeiger auf eine const char , während char * const ist ein konstanter Zeiger auf eine char .

Im ersten Fall kann der Wert, auf den gezeigt wird, nicht geändert werden, wohl aber der Zeiger. Im zweiten Fall kann sich der Wert, auf den gezeigt wird, ändern, der Zeiger jedoch nicht (ähnlich wie bei einer Referenz).

Außerdem gibt es eine

const char * const

der ein konstanter Zeiger auf ein konstantes Zeichen ist (es kann also nichts daran geändert werden).

Nota:

Die beiden folgenden Formen sind gleichwertig:

const char *

und

char const *

Der genaue Grund dafür ist in der C++-Norm beschrieben, aber es ist wichtig, dies zu beachten und Verwirrung zu vermeiden. Ich kenne mehrere Codierungsstandards, die dies bevorzugen:

char const

über

const char

(mit oder ohne Zeiger), so dass die Platzierung des const Element ist dasselbe wie bei einem Zeiger const .

141voto

diapir Punkte 2642

Um Verwechslungen zu vermeiden, sollten Sie immer anhängen. den const-Bezeichner.

int       *      mutable_pointer_to_mutable_int;
int const *      mutable_pointer_to_constant_int;
int       *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;

63voto

Don McCaughey Punkte 8962

const modifiziert immer das Ding, das vor ihm steht (links davon), AUSSER wenn es das erste Ding in einer Typdeklaration ist, wo es das Ding modifiziert, das nach ihm steht (rechts davon).

Die beiden sind also identisch:

int const *i1;
const int *i2;

definieren sie Zeiger auf eine const int . Sie können ändern, wo i1 y i2 Punkte, aber Sie können den Wert, auf den sie zeigen, nicht ändern.

Dies:

int *const i3 = (int*) 0x12345678;

definiert eine const Zeiger auf eine Ganzzahl und initialisiert ihn auf die Speicherstelle 12345678. Sie können den int Wert an der Adresse 12345678, aber Sie können die Adresse nicht ändern, die i3 zeigt auf.

29voto

Mr. Llama Punkte 19267

Faustformel: Lesen Sie die Definition von rechts nach links!


const int *foo;

Bedeutet " foo Punkte ( * ) zu einer int die sich nicht ändern können ( const )".
Für den Programmierer bedeutet das: "Ich werde die Daten nicht ändern. Wert wovon foo zeigt auf".

  • *foo = 123; o foo[0] = 123; wäre ungültig.
  • foo = &bar; ist erlaubt.

int *const foo;

Bedeutet " foo nicht ändern kann ( const ) und Punkte ( * ) zu einer int ".
Für den Programmierer bedeutet das: "Ich werde die Daten nicht ändern. Speicheradresse dass foo bezieht sich auf".

  • *foo = 123; o foo[0] = 123; ist erlaubt.
  • foo = &bar; wäre ungültig.

const int *const foo;

Bedeutet " foo nicht ändern kann ( const ) und Punkte ( * ) zu einer int die sich nicht ändern können ( const )".
Für den Programmierer bedeutet dies: "Ich werde die Daten nicht ändern. Wert wovon foo verweist, noch werde ich die Adresse dass foo bezieht sich auf".

  • *foo = 123; o foo[0] = 123; wäre ungültig.
  • foo = &bar; wäre ungültig.

27voto

Andrew Coleson Punkte 9802

const char* ist ein Zeiger auf ein konstantes Zeichen
char* const ist ein konstanter Zeiger auf ein Zeichen
const char* const ist ein konstanter Zeiger auf ein konstantes Zeichen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X