Lesen Sie es rückwärts (wie von Uhrzeiger/Spiralregel ):
int*
- Zeiger auf int
int const *
- Zeiger auf const int
int * const
- Konstante Zeiger auf int
int const * const
- const-Zeiger auf const int
Jetzt die erste const
kann also auf beiden Seiten des Typs stehen:
const int *
== int const *
const int * const
== int const * const
Wenn Sie richtig verrückt werden wollen, können Sie so etwas machen:
int **
- Zeiger auf Zeiger auf int
int ** const
- ein Konstantenzeiger auf einen Zeiger auf einen int
int * const *
- einen Zeiger auf einen Konstanten Zeiger auf einen int
int const **
- einen Zeiger auf einen Zeiger auf eine const int
int * const * const
- einen konstanten Zeiger auf einen konstanten Zeiger auf einen int
- ...
Und um sicherzustellen, dass wir uns über die Bedeutung von const
:
int a = 5, b = 10, c = 15;
const int* foo; // pointer to constant int.
foo = &a; // assignment to where foo points to.
/* dummy statement*/
*foo = 6; // the value of a can´t get changed through the pointer.
foo = &b; // the pointer foo can be changed.
int *const bar = &c; // constant pointer to int
// note, you actually need to set the pointer
// here because you can't change it later ;)
*bar = 16; // the value of c can be changed through the pointer.
/* dummy statement*/
bar = &a; // not possible because bar is a constant pointer.
foo
ist ein variabler Zeiger auf eine konstante Ganzzahl. Auf diese Weise können Sie den Wert, auf den Sie zeigen, ändern, nicht aber den Wert, auf den Sie zeigen. Am häufigsten sieht man dies bei Strings im C-Stil, wo man einen Zeiger auf eine const char
. Sie können die Zeichenkette, auf die Sie zeigen, ändern, aber Sie können den Inhalt dieser Zeichenketten nicht ändern. Dies ist wichtig, wenn die Zeichenkette selbst im Datensegment eines Programms liegt und nicht geändert werden soll.
bar
ist eine Konstante oder ein fester Zeiger auf einen Wert, der geändert werden kann. Dies ist wie eine Referenz ohne den zusätzlichen syntaktischen Zucker. Aus diesem Grund verwenden Sie normalerweise eine Referenz, wo Sie eine T* const
Zeiger, es sei denn, Sie müssen die NULL
Zeigern.
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?3 Stimmen
@MarkKCowan In Pascal würde es etwa so lauten
function(x:^char):^int
. Dort sind Funktionstypen implizit ein Zeiger auf eine Funktion, so dass keine Notwendigkeit besteht, sie zu spezifizieren, und Pascal erzwingt keine const-Korrektheit. Es kann von links nach rechts gelesen werden.0 Stimmen
@Calmarius: In Pascal können komplexere Typen jedoch oft nicht in einem einzigen Ausdruck dargestellt werden, sondern müssen durch die Deklaration verschiedener einfacher Sub-Type-Ausdrücke zusammengesetzt werden.
13 Stimmen
Das erste, was links von "const" steht, ist das, was konstant ist. Wenn "const" das ist, was am weitesten links steht, dann ist das erste, was rechts davon steht, das, was konstant ist.
0 Stimmen
Obwohl viele gute Antworten gegeben werden, scheint es, dass der Teil der Frage, in dem es um die Frage geht, nicht beantwortet wird: "Übergabe an Funktionen" noch nicht wirklich beantwortet ist?
0 Stimmen
Ich frage mich z.B. immer noch, ob es jemals sinnvoll ist, eine Funktionsdeklaration f(const Class * const obj) anstelle von f(const Class * obj) zu haben? Bringt das zweite const in der ersten Deklaration überhaupt etwas? Ich würde sagen nein, da der Zeiger ohnehin als Wert übergeben wird
0 Stimmen
Wie kommt es, dass Ihr Name angezeigt wird, es aber so aussieht, als hätten Sie Ihr Konto selbst gelöscht?
1 Stimmen
ISO C++ FAQ : Was ist der Unterschied zwischen
const X* p
,X* const p
yconst X* const p
?0 Stimmen
Cdecl.org verwendet eine alte Version von cdecl; eine Version von cdecl, die modernes C und C++ versteht, finden Sie hier: github.com/paul-j-lucas/cdecl
0 Stimmen
@MarkKCowan Können Sie bitte einen Blick darauf werfen stackoverflow.com/questions/70921574/