wake-up-neo.net

const char * und char const * - sind sie gleich?

Nach meinem Verständnis sollten const-Modifikatoren von rechts nach links gelesen werden. Davon bekomme ich das:

const char*

ist ein Zeiger, dessen char-Elemente nicht geändert werden können, der Zeiger selbst kann jedoch und

char const*

ist ein konstanter Zeiger auf mutable-Zeichen.

Ich erhalte jedoch die folgenden Fehler für den folgenden Code:

const char* x = new char[20];
x = new char[30];   //this works, as expected
x[0] = 'a';         //gives an error as expected

char const* y = new char[20];
y = new char[20];   //this works, although the pointer should be const (right?)
y[0] = 'a';         //this doesn't although I expect it to work

Also ... welches ist es? Ist mein Verständnis oder mein Compiler (VS 2005) falsch?

78
Luchian Grigore

Gemäß dem Standard ändert const das Element direkt in seine linke . Die Verwendung von const am Anfang einer Deklaration ist nur eine praktische Abkürzung für das Denken. Die folgenden zwei Aussagen sind also gleichwertig:

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

Um sicherzustellen, dass der Zeiger selbst nicht geändert wird, sollte const hinter dem Sternchen stehen:

char * const constantPointerToMutableContent;

Um sowohl den Zeiger als auch den Inhalt zu schützen, auf den er verweist, verwenden Sie zwei Konstanten.

char const * const constantPointerToConstantContent;

Ich persönlich habe always angenommen, indem ich den const nach dem Teil setze, den ich nicht ändern möchte, so dass ich die Konsistenz beibehalte, selbst wenn der Zeiger der Teil ist, den ich konstant halten möchte.

126
Greyson

Es funktioniert, weil beide gleich sind. Kann es sein, dass Sie verwirrt sind,

const char*  // both are same
char const*

und

char* const  // unmutable pointer to "char"

und

const char* const  // unmutable pointer to "const char"

[Um sich daran zu erinnern, hier eine einfache Regel: '*' wirkt sich zuerst auf die gesamte LHS aus ]

29
iammilind

Das ist, weil die Regel lautet:

RULE: const bindet links, außer es gibt nichts auf der linken Seite, dann bindet es rechts :)

so sieh dir diese an als:

(const --->> char)*
(char <<--- const)*

beide gleich! Oh, und --->> und <<--- sind NICHT Operatoren, sie zeigen nur, woran die const bindet.

24
Akanksh

(von 2 einfache variable Initialisierungsfrage )

Eine wirklich gute Faustregel bezüglich const

Deklarationen lesen von rechts nach links.

(Siehe Vandevoorde/Josutiss "C++ Templates: The Complete Guide")

Z.B.: 

int const x; // x is a constant int
const int x; // x is an int which is const

// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p;        // p is a reference to const-int
int * const * p;     // p is a pointer to const-pointer to int.

Seit ich dieser Faustregel folge, habe ich solche Erklärungen nie mehr falsch interpretiert.

(: sisab retcarahc-rep eine tonlose, sisab nekot-rep eine no tfel-ot-thgir naem ich hatte: tidE

11
Sebastian Mach

So versuche ich immer zu interpretieren:

char *p

     |_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".

char * const p

     |_____ again start from the asterisk. "content of constant (since we have the `const` 
            modifier in the front) `p` is a `char`".

char const *p

           |_____ again start from the asterisk. "content of `p` is a constant `char`".

Ich hoffe es hilft!

5
yasouser

In beiden Fällen zeigen Sie auf ein konstantes Zeichen.

const char * x  //(1) a variable pointer to a constant char
char const * x  //(2) a variable pointer to a constant char
char * const x  //(3) a constant pointer to a variable char
char const * const x //(4) a constant pointer to a constant char
char const * const * x //(5) a variable pointer to a constant pointer to a constant char
char const * const * const x //(6) can you guess this one?

Standardmäßig gilt const für das, was unmittelbar an ist links, aber es könnte sich auf das unmittelbar rechts davon beziehen, wenn nichts wie in (1) vorangeht.

0
Lino Mediavilla