1845 Stimmen

Was ist der Unterschied zwischen const int*, const int * const, und int const *?

Ich bringe immer durcheinander, wie man const int* , const int * const y int const * richtig. Gibt es eine Reihe von Regeln, die festlegen, was Sie tun dürfen und was nicht?

Ich möchte wissen, was ich tun und was ich lassen soll, wenn es um Zuweisungen, die Übergabe an Funktionen usw. geht.

256 Stimmen

Sie können die "Clockwise/Spiral Rule" um die meisten C- und C++-Deklarationen zu entschlüsseln.

76 Stimmen

cdecl.org ist eine großartige Website, die automatisch C-Deklarationen für Sie übersetzt.

11 Stimmen

@Calmarius: Beginnen Sie an der Stelle, an der sich der Typenname befindet bzw. befinden sollte, gehen Sie nach rechts, wenn Sie können, und nach links, wenn Sie müssen. . int *(*)(char const * const) . Beginnen Sie rechts von der eingeklammerten * dann müssen wir nach links gehen: pointer . Außerhalb der Klammern können wir nach rechts gehen: pointer to function of ... . Dann müssen wir nach links gehen: pointer to function of ... that returns pointer to int . Wiederholen Sie den Vorgang, um den Parameter zu erweitern (die ... ) : pointer to function of (constant pointer to constant char) that returns pointer to int . Wie würde die entsprechende einzeilige Erklärung in einer leicht lesbaren Sprache wie Pascal aussehen?

24voto

T.E.D. Punkte 42630

Diese Frage zeigt genau warum ich die Dinge gerne so mache, wie ich es in meiner Frage erwähnt habe Ist const nach type id akzeptabel?

Kurz gesagt, finde ich, dass man sich die Regel am einfachsten merken kann, wenn die "const" wie folgt lautet nach die Sache, auf die sie sich bezieht. In Ihrer Frage bedeutet "int const *" also, dass der int konstant ist, während "int * const" bedeuten würde, dass der Zeiger konstant ist.

Wenn jemand beschließt, sie ganz vorne zu setzen (z. B. "const int *"), gilt sie in diesem Fall ausnahmsweise für das, was danach kommt.

Viele Menschen nutzen diese Ausnahmeregelung gerne, weil sie denken, dass es schöner aussieht. Ich mag sie nicht, weil sie eine Ausnahme ist und damit Verwirrung stiftet.

3 Stimmen

Ich bin hin- und hergerissen in dieser Frage. Logisch gesehen macht es Sinn. Die meisten C++-Entwickler würden jedoch schreiben const T* und es ist natürlicher geworden. Wie oft verwenden Sie eine T* const Wie auch immer, in der Regel reicht eine Referenz aus. Ich wurde einmal von all dem gebissen, als ich eine boost::shared_ptr<const T> und schrieb stattdessen const boost::shared_ptr<T> . Dasselbe Problem in einem etwas anderen Kontext.

0 Stimmen

Eigentlich verwende ich Konstantenzeiger häufiger als Konstanten. Außerdem müssen Sie darüber nachdenken, wie Sie in Gegenwart von Zeigern auf Zeiger (etc.) reagieren werden. Zugegebenermaßen sind diese seltener, aber es wäre schön, über die Dinge in einer Weise zu denken, wo Sie diese Situationen mit applomb behandeln können.

1 Stimmen

Ein weiterer Vorteil der Platzierung der Konstanten auf der rechten Seite der Schrift ist, dass nun alles links von jeder const ist der Typ dessen, was const ist, und alles zu seiner Rechten ist das, was tatsächlich const ist. Zum Beispiel int const * const * p; als ein Beispiel. Nein, ich schreibe normalerweise nicht so, das ist nur ein Beispiel. Erste const : Typ int, Und der int, der const ist, ist der Inhalt des const-Zeigers, der der Inhalt von p . Zweite Konstante: Typ ist Zeiger auf const int, const oblect ist der Inhalt von p

23voto

AProgrammer Punkte 49452

Die allgemeine Regel lautet, dass die const gilt für das, was ihm unmittelbar vorausgeht. Ausnahme, ein beginnendes const gilt für das, was folgt.

  • const int* ist dasselbe wie int const* und bedeutet "Zeiger auf Konstante int" .
  • const int* const ist dasselbe wie int const* const und bedeutet "Konstanter Zeiger auf konstanten Wert" .

Bearbeiten: Für die Dos und Don'ts, wenn diese Antwort nicht ausreicht, könnten Sie genauer beschreiben, was Sie wollen?

21voto

ufukgun Punkte 6631

Einfache Verwendung von const .

Die einfachste Verwendung ist die Deklaration einer benannten Konstante. Dazu deklariert man eine Konstante, als wäre sie eine Variable, fügt aber const vor ihm. Man muss ihn sofort im Konstruktor initialisieren, denn man kann den Wert natürlich nicht nachträglich setzen, weil man ihn damit verändern würde. Zum Beispiel:

const int Constant1=96; 

erzeugt eine Integer-Konstante, die fantasielos Constant1 mit dem Wert 96.

Solche Konstanten sind nützlich für Parameter, die im Programm verwendet werden, aber nach der Kompilierung des Programms nicht mehr geändert werden müssen. Dies hat für Programmierer einen Vorteil gegenüber dem C-Präprozessor #define Befehl, da er vom Compiler selbst verstanden und verwendet wird und nicht nur vom Präprozessor in den Programmtext eingefügt wird, bevor er den Hauptcompiler erreicht, so dass Fehlermeldungen viel hilfreicher sind.

Es funktioniert auch mit Zeigern, aber man muss vorsichtig sein, wo const um festzustellen, ob der Zeiger oder das, worauf er zeigt, konstant ist oder beides. Zum Beispiel:

const int * Constant2 

erklärt, dass Constant2 ist ein variabler Zeiger auf eine konstante Ganzzahl und:

int const * Constant2

ist eine alternative Syntax, die dasselbe tut, während

int * const Constant3

erklärt, dass Constant3 ist ein konstanter Zeiger auf eine variable Ganzzahl und

int const * const Constant4

erklärt, dass Constant4 ist ein konstanter Zeiger auf eine konstante Ganzzahl. Grundsätzlich gilt 'const' für alles, was sich unmittelbar links von ihm befindet (außer wenn sich dort nichts befindet, in diesem Fall gilt es für alles, was sich unmittelbar rechts von ihm befindet).

ref: http://duramecho.com/ComputerInformation/WhyHowCppConst.html

18voto

Abhijit Sahu Punkte 185

Es ist einfach, aber knifflig. Bitte beachten Sie, dass wir die const zu einem beliebigen Datentyp ( int , char , float , usw.).

Sehen wir uns die folgenden Beispiele an.


const int *p ==> *p ist schreibgeschützt [ p ist ein Zeiger auf eine konstante Ganzzahl]

int const *p ==> *p ist schreibgeschützt [ p ist ein Zeiger auf eine konstante Ganzzahl]


int *p const ==> Falsch Erklärung. Der Compiler gibt einen Syntaxfehler aus.

int *const p ==> p ist schreibgeschützt [ p ist ein konstanter Zeiger auf eine ganze Zahl]. Als Zeiger p hier schreibgeschützt ist, sollten die Deklaration und die Definition an derselben Stelle stehen.


const int *p const ==> Falsch Erklärung. Der Compiler gibt einen Syntaxfehler aus.

const int const *p ==> *p ist schreibgeschützt

const int *const p ==> *p y p sind schreibgeschützt [ p ist ein konstanter Zeiger auf eine konstante ganze Zahl]. Als Zeiger p hier schreibgeschützt ist, sollten die Deklaration und die Definition an derselben Stelle stehen.


int const *p const ==> Falsch Erklärung. Der Compiler gibt einen Syntaxfehler aus.

int const int *p ==> Falsch Erklärung. Der Compiler gibt einen Syntaxfehler aus.

int const const *p ==> *p ist schreibgeschützt und entspricht int const *p

int const *const p ==> *p y p sind schreibgeschützt [ p ist ein konstanter Zeiger auf eine konstante ganze Zahl]. Als Zeiger p hier schreibgeschützt ist, sollten die Deklaration und die Definition an derselben Stelle stehen.

12voto

rgk Punkte 848

Ich hatte dieselben Zweifel wie Sie, bis ich auf Folgendes stieß Buch von dem C++-Guru Scott Meyers. Siehe den dritten Punkt in diesem Buch, in dem er ausführlich über die Verwendung von const .

Befolgen Sie einfach diesen Ratschlag

  1. Wenn das Wort const links vom Sternchen erscheint, ist das, worauf verwiesen wird, konstant
  2. Wenn das Wort const erscheint rechts vom Sternchen, der Zeiger selbst ist konstant
  3. Si const erscheint auf beiden Seiten, beide sind konstant

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