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?

8voto

Cheers and hth. - Alf Punkte 138555

Die Deklarationssyntax von C und C++ ist von den ursprünglichen Entwicklern wiederholt als gescheitertes Experiment bezeichnet worden.

Stattdessen sollten wir Name den Typ "Zeiger auf Type "; ich nenne es Ptr_ :

template< class Type >
using Ptr_ = Type*;

Jetzt Ptr_<char> ist ein Zeiger auf char .

Ptr_<const char> ist ein Zeiger auf const char .

Und const Ptr_<const char> ist eine const Zeiger auf const char .

4 Stimmen

Haben Sie ein Zitat für den ersten Satz?

1 Stimmen

@sp2danny: Wenn man nach "C syntax failed experiment" googelt, findet man nur eine Reihe von Interviews mit Bjarne Stroustrup, in denen er sich wie folgt äußert seine Meinung in diese Richtung, z.B. "Ich betrachte die C-Deklarator-Syntax als ein Experiment, das gescheitert ist" in dem Slashdot-Interview. Ich habe also keine Referenz für die Behauptung über die Ansichten der ursprünglichen Designer von C. Ich schätze, man kann sie durch ausreichend starke Forschungsanstrengungen finden oder vielleicht widerlegen, indem man sie einfach fragt, aber ich denke, es ist besser so, wie es jetzt ist. mit diesem Teil der Behauptung, noch unentschieden und wahrscheinlich wahr:)

0 Stimmen

Oh, Dennis Ritchie ist verstorben. Brian Kernighan ist immer noch aktiv. Aber in dem Wikipedia-Artikel über ihn heißt es: "Kernighan beteuerte, dass er keinen Anteil an der Entwicklung der Sprache C hatte ("es ist ausschließlich Dennis Ritchies Werk").".

8voto

sri Punkte 349

Für mich ist die Position des const d. h., ob es links oder rechts oder sowohl links als auch rechts von der Linie erscheint. * hilft mir, die eigentliche Bedeutung zu verstehen.

  1. A const zur LINKEN von * zeigt an, dass das Objekt, auf das der Zeiger zeigt, ein const Objekt.

  2. A const nach RECHTS von * zeigt an, dass der Zeiger ein const Zeiger.

Die folgende Tabelle ist dem Stanford CS106L Standard C++ Programming Laboratory Course Reader entnommen.

enter image description here

0 Stimmen

Was genau ist der Unterschied zwischen "neu zuweisen" und "ändern" für einen Zeiger?

7voto

MoBaShiR Punkte 422

Leicht zu merken:

Wenn const vor * steht, ist der Wert konstant.

Wenn const nach * steht, ist die Adresse konstant.

wenn const sowohl vor als auch nach * vorhanden ist, sind sowohl Wert als auch Adresse konstant.

z.B..

  1. int * const var; //hier ist die Adresse konstant.

  2. int const * var; //hier ist der Wert konstant.

  3. int const * const var; // sowohl Wert als auch Adresse sind konstant.

6voto

Jeff Burdges Punkte 4166

Es gibt noch viele andere Feinheiten, die die Korrektheit von const in C++ betreffen. Ich nehme an, die Frage bezog sich hier einfach auf C, aber ich werde einige verwandte Beispiele anführen, da das Thema C++ ist:

  • Sie übergeben oft große Argumente wie Zeichenketten als TYPE const & die verhindert, dass das Objekt geändert oder kopiert wird. Beispiel:

    TYPE& TYPE::operator=(const TYPE &rhs) { ... return *this; }

    Aber TYPE & const ist bedeutungslos, da Referenzen immer const sind.

  • Sie sollten Klassenmethoden, die die Klasse nicht verändern, immer als const aufzurufen, sonst können Sie die Methode nicht aus einer TYPE const & Hinweis. Beispiel:

    bool TYPE::operator==(const TYPE &rhs) const { ... }

  • Es gibt häufig Situationen, in denen sowohl der Rückgabewert als auch die Methode const sein sollten. Beispiel:

    const TYPE TYPE::operator+(const TYPE &rhs) const { ... }

    Const-Methoden dürfen nämlich keine klasseninternen Daten als Verweis auf Non-Const zurückgeben.

  • Infolgedessen muss man oft sowohl eine const- als auch eine non-const-Methode mit const-Überladung erstellen. Wenn Sie zum Beispiel definieren T const& operator[] (unsigned i) const; , dann wollen Sie wahrscheinlich auch die nicht-konstante Version, die durch gegeben ist:

    inline T& operator[] (unsigned i) { return const_cast<char&>( static_cast<const TYPE&>(*this)[](i) ); }

Afaik gibt es in C keine Konst-Funktionen, Nicht-Mitglieder-Funktionen können in C++ selbst nicht konstant sein, Konst-Methoden können Seiteneffekte haben, und der Compiler kann keine Konst-Funktionen verwenden, um doppelte Funktionsaufrufe zu vermeiden. In der Tat, selbst eine einfache int const & Referenz kann der Wert, auf den sie sich bezieht, an anderer Stelle geändert werden.

4voto

Die const mit dem int auf beiden Seiten macht Zeiger auf Konstante int :

const int *ptr=&i;

oder:

int const *ptr=&i;

const* wird machen Konstanter Zeiger auf int :

int *const ptr=&i;

In diesem Fall sind alle diese Punkte Zeiger auf konstante Ganzzahl , aber keine davon ist ein konstanter Zeiger:

 const int *ptr1=&i, *ptr2=&j;

In diesem Fall sind alle Zeiger auf konstante Ganzzahl und ptr2 ist Konstanter Zeiger auf konstante Ganzzahl . Aber ptr1 ist kein konstanter Zeiger:

int const *ptr1=&i, *const ptr2=&j;

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