Viele Leute haben richtig geantwortet, ich werde mich hier gut organisieren und einige zusätzliche Informationen einfügen, die in den gegebenen Antworten fehlen.
Const ist ein Schlüsselwort in der Sprache C, das auch als Qualifier bezeichnet wird. Const kann auf die Deklaration einer beliebigen Variablen angewendet werden, um festzulegen, dass ihr Wert nicht geändert wird
const int a=3,b;
a=4; // give error
b=5; // give error as b is also const int
you have to intialize while declaring itself as no way to assign
it afterwards.
Wie liest man?
Lesen Sie einfach von rechts nach links, jede Aussage funktioniert reibungslos.
3 wesentliche Dinge
type a. p is ptr to const int
type b. p is const ptr to int
type c. p is const ptr to const int
[Fehler]
if * comes before int
zwei Typen
1. const int *
2. const const int *
wir schauen zuerst
Haupttyp 1. const int *
Möglichkeiten, 3 Dinge an 3 Stellen anzuordnen 3!=6
i. * zu Beginn
*const int p [Error]
*int const p [Error]
ii. const zu Beginn
const int *p type a. p is ptr to const int
const *int p [Error]
iii. int zu Beginn
int const *p type a.
int * const p type b. p is const ptr to int
Haupttyp 2. const const int *
Möglichkeiten, 4 Dinge an 4 Stellen anzuordnen, von denen 2 gleich sind 4!/2!=12
i. * zu Beginn
* int const const p [Error]
* const int const p [Error]
* const const int p [Error]
ii. int zu Beginn
int const const *p type a. p is ptr to const int
int const * const p type c. p is const ptr to const int
int * const const p type b. p is const ptr to int
iii. const zu Beginn
const const int *p type a.
const const * int p [Error]
const int const *p type a.
const int * const p type c.
const * int const p [Error]
const * const int p [Error]
Quetschen alles in einem
Typ a. p ist ptr zu const int (5)
const int *p
int const *p
int const const *p
const const int *p
const int const *p
Typ b. p ist const ptr zu int (2)
int * const p
int * const const p;
Typ c. p ist const ptr zu const int (2)
int const * const p
const int * const p
nur eine kleine Berechnung
1. const int * p total arrangemets (6) [Errors] (3)
2. const const int * p total arrangemets (12) [Errors] (6)
kleines Extra
int const * p,p2 ;
here p is ptr to const int (type a.)
but p2 is just const int please note that it is not ptr
int * const p,p2 ;
similarly
here p is const ptr to int (type b.)
but p2 is just int not even cost int
int const * const p,p2 ;
here p is const ptr to const int (type c.)
but p2 is just const int.
Fertige
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/