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

Lesezeit: 8 Minuten

Benutzeravatar von LB
PFUND.

Was ist der Unterschied zwischen:

char * const 

und

const char *

  • Mögliches Duplikat von Was ist der Unterschied zwischen const int*, const int * const und int const *?

    – Emlai

    14. Februar 2016 um 13:07 Uhr

  • Das erste, was links von “const” steht, ist die Konstante. Wenn “const” das am weitesten links stehende Ding ist, dann ist das erste Ding rechts davon die Konstante.

    – Cupcake

    31. Juli 2016 um 4:43 Uhr

  • Als freundlicher Tipp, vergiss das nie cdekl ist eine Sache.

    – Braden Best

    16. Juni 2018 um 7:42 Uhr

  • Es gibt eine weitere char const*, die der Rückgabetyp von exception::what() ist.

    – Zhang

    22. Juli 2019 um 3:14 Uhr

  • Häufig gestellte Fragen zu ISO C++: Was ist der Unterschied zwischen „const X* p“, „X* const p“ und „const X* const p“?

    – legends2k

    21. September 2020 um 16:25 Uhr

Benutzeravatar von workmad3
arbeitswütig3

Der Unterschied ist das const char * ist ein Zeiger auf a const charwährend char * const ist ein konstanter Zeiger auf a char.

Erstens kann der Wert, auf den gezeigt wird, nicht geändert werden, der Zeiger jedoch schon. Zweitens kann sich der Wert, auf den gezeigt wird, ändern, der Zeiger jedoch nicht (ähnlich wie bei einer Referenz).

Da ist auch ein

const char * const

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

Notiz:

Die beiden folgenden Formen sind gleichwertig:

const char *

und

char const *

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

char const

Über

const char

(mit oder ohne Zeiger), damit die Platzierung der const element ist dasselbe wie bei einem Zeiger const.

  • Wäre es sinnvoll zu beachten, was passiert, wenn mehrere Variablen in derselben Deklaration angegeben werden? Ich glaube const int *foo,*bar; würde beides erklären foo und bar sein int const *aber int const *foo, *bar würde erklären foo ein … zu sein int const * und bar sein int *. Ich finde typedef int * intptr; const intptr foo,bar; würde beide Variablen deklarieren int * const; Ich kenne keine Möglichkeit, eine kombinierte Deklaration zu verwenden, um zwei Variablen dieses Typs ohne Typedef zu erstellen.

    – Superkatze

    12. April 2013 um 21:57 Uhr

  • @Superkatze I believe const int *foo,*bar; would declare both foo and bar to be int const *: Ja. but int const *foo, *bar would declare foo to be a int const * and bar to be int *: Nein! Es wäre genau das gleiche wie im vorherigen Fall. (Sehen ideone.com/RsaB7n wo Sie den gleichen Fehler für foo und bar erhalten). I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const: Ja. I don't know any way to use a combined declaration to create two variables of that type without a typedef: Brunnen, int *const foo, *const bar;. C-Deklarator-Syntax …

    – gx_

    28. August 2013 um 18:35 Uhr


  • @gx_: Also habe ich mich geirrt – meine Unsicherheit war der Grund, warum ich vorgeschlagen habe, dass es hilfreich sein könnte, zu sagen, was die Regeln sind. Was würde int const *foo, *volatile bar tun bar? Mach es beides const und volatile? Ich vermisse Pascals saubere Trennung von deklarierten Variablennamen und ihren Typen (ein Zeiger auf ein Array von Zeigern auf Ganzzahlen wäre var foo: ^Array[3..4] of ^Integer;`. Das wäre eine lustige verschachtelte Klammer in C, denke ich.

    – Superkatze

    28. August 2013 um 18:54 Uhr

  • @supercat (Oh, nur C, Entschuldigung für den C++-Code-Link, ich bin von einer C++-Frage hierher gekommen) Es dreht sich alles um die C-Deklarationssyntaxmit einem (“rein”) Typ Teil gefolgt von a Deklarator. Im “int const *foo, *volatile bar” Der Typteil ist int const (hält vor dem *) und die Deklaratoren sind *foo (der Ausdruck *foo bezeichnet ein int const) und *volatile bar; lesen rechts nach links (gute Regel für Lebenslauf-Qualifikanten), foo ist ein Zeiger auf a konst int und bar ist ein flüchtig Zeiger auf a konst int (der Zeiger selbst ist flüchtig, das gezeigte int ist es [accessed as] konstant).

    – gx_

    28. August 2013 um 21:23 Uhr


  • @supercat Und was “ein Zeiger auf ein Array von Zeigern auf ganze Zahlen” betrifft (ich kenne Pascal nicht, bin mir nicht sicher über die [3..4] Syntax, nehmen wir also ein Array aus 10 Elementen): int *(*foo)[10];. Es spiegelt seine (zukünftige) Verwendung als Ausdruck wider: *(*foo)[i] (mit i eine Ganzzahl im Bereich [0, 10) i.e. [0, 9]) wird zuerst dereferenzieren foo Um an das Array zu gelangen, greifen Sie dann auf das Element am Index zu i (weil postfix [] bindet enger als Präfix *), dereferenzieren Sie dann dieses Element, was schließlich ein ergibt int (sehen ideone.com/jgjIjR ). Aber typedef macht es einfacher (vgl ideone.com/O3wb7d ).

    – gx_

    28. August 2013 um 21:25 Uhr

Um Verwirrung zu vermeiden, immer anhängen der const-Qualifizierer.

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;

  • Wieso den? “Um Verwirrung zu vermeiden” erklärt nicht, was die Verwirrung für mich ist.

    – Andrew Weir

    20. November 2013 um 11:48 Uhr

  • @Andrew: Ich habe auf Konsistenz und damit Lesbarkeit hingewiesen. Schreiben Sie alle Typqualifizierer so, dass sie ändern, was auf ihrer linken Seite steht, stetsist das, was ich benutze.

    – Diapir

    20. November 2013 um 14:31 Uhr


  • Eigentlich ist es die beste Antwort zu diesem Thema, die ich in SO gefunden habe

    – Fangen

    22. April 2014 um 15:51 Uhr

  • Als Codestandard bin ich diesem Stil selten begegnet und werde ihn daher wahrscheinlich nicht übernehmen. Als Lernhilfe war diese Antwort jedoch sehr hilfreich! (Ich denke, zu schade, dass dies kein häufigerer Stil ist.)

    – nat

    29. September 2014 um 21:33 Uhr

  • @Alla: p bezieht sich nicht auf den Typ: (const int *const). Zum Besseren oder Schlechteren (schlechter, wenn Sie mich fragen) soll der const-Qualifizierer sowohl in C als auch in C++ postfix : cf const Member-Funktion sein void foo(int a) const;. Die Möglichkeit zu deklarieren const int ist eher die Ausnahme als die Regel.

    – diapir

    9. April 2015 um 7:17 Uhr


const ändert immer das, was davor steht (links davon), AUSSER wenn es das erste Ding in einer Typdeklaration ist, wo es das Ding ändert, das danach kommt (rechts davon).

Diese beiden sind also gleich:

int const *i1;
const int *i2;

sie definieren Zeiger auf a const int. Du kannst wo ändern i1 und i2 Punkte, aber Sie können den Wert, auf den sie zeigen, nicht ändern.

Dies:

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

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

Benutzeravatar von Andrew Coleson
Andreas Coleson

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

Benutzeravatar von Adam Rosenfield
Adam Rosenfield

const * char ist ungültiger C-Code und bedeutungslos. Vielleicht wollten Sie nach dem Unterschied zwischen a fragen const char * und ein char const *oder möglicherweise der Unterschied zwischen a const char * und ein char * const?

Siehe auch:

  • Was sind konstante Zeiger (im Gegensatz zu Zeigern auf konstante Objekte)?
  • Konstante in C
  • Unterschied zwischen const-Deklarationen in C++
  • C++ const-Frage
  • Warum kann ich die Werte einer const char*-Variablen ändern?

Benutzeravatar von Mr. Llama
Herr Lama

Faustregel: Lies die Definition von rechts nach links!


const int *foo;

Meint “foo Punkte (*) zu einem int das kann sich nicht ändern (const)”.
Für den Programmierer bedeutet das: „Ich werde die nicht ändern Wert von was foo verweist auf”.

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

int *const foo;

Meint “foo kann nicht ändern (const) und Punkte (*) zu einem int“.
Für den Programmierer bedeutet das: „Ich werde die nicht ändern Speicheradresse das foo bezieht sich auf”.

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

const int *const foo;

Meint “foo kann nicht ändern (const) und Punkte (*) zu einem int das kann sich nicht ändern (const)”.
Für den Programmierer bedeutet das: „Ich werde die nicht ändern Wert von was foo weist darauf hin, noch werde ich das ändern die Anschrift das foo bezieht sich auf”.

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

Benutzeravatar von Evan Carroll
Evan Caroll

  1. konstantes Zeichen* x Hier ist X im Grunde ein Zeichenzeiger, der auf einen konstanten Wert zeigt

  2. char* const x bezieht sich auf einen Zeichenzeiger, der konstant ist, aber die Position, auf die er zeigt, kann sich ändern.

  3. const char* const x ist eine Kombination aus 1 und 2, bedeutet, dass es sich um einen konstanten Zeichenzeiger handelt, der auf einen konstanten Wert zeigt.

  4. const *Zeichen x wird einen Compilerfehler verursachen. es kann nicht deklariert werden.

  5. Zeichenkonstante * x ist gleich Punkt 1.

die Faustregel lautet, wenn konst mit var name ist dann das Der Zeiger bleibt konstant, aber die Zeigeposition kann geändert werden anders Der Zeiger zeigt auf eine konstante Position und der Zeiger kann auf eine andere Position zeigen, aber der Inhalt der zeigenden Position kann nicht geändert werden.

  • “char* const x bezieht sich auf einen Zeichenzeiger, der konstant ist, aber die Position, auf die er zeigt, kann sich ändern.” Falsch. Der Wert am Standort kann geändert werden, nicht der Standort selbst.

    – Bitte helfen

    12. März 2015 um 13:44 Uhr

1427440cookie-checkWas ist der Unterschied zwischen char * const und const char *?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy