Sehr komplizierte Variablendeklarationen - HILFE!
-
thomassteiner schrieb:
1. p ist ein Zeiger auf einen konstanten double. Der Zeiger wird mit 0 initialisiert.
mein vorschlag: double const* p = 0;Das ist ein konstanter Zeiger, der auf double zeigt.
//edit: const* is eh Rotz^^const double* p = 0;so ist das besser
-
Meiner C++-Kenntnis nach ist beides das gleiche.
-
int j = 578; int *p = &j; //Variabler Zeiger, variables Objekt const int *p2 = &j; //Variabler Zeiger, konstantes Objekt //int const *p2 = &j; //ebenso: Variabler Zeiger, konstantes Objekt int * const p3 = &j; //Konstanter Zeiger, variables Objekt const int * const p4 = &j; //Konstanter Zeiger, konstantes Objekt
-
Pellaeon schrieb:
thomassteiner schrieb:
1. p ist ein Zeiger auf einen konstanten double. Der Zeiger wird mit 0 initialisiert.
mein vorschlag: double const* p = 0;Das ist ein konstanter Zeiger, der auf double zeigt.
//edit: const* is eh Rotz^^const double* p = 0;so ist das besser
nö.
"p ist ein Zeiger auf einen konstanten double" liest man vom p aus nach außen.
double const* p
"p ist ein konstanter Zeiger auf einen double" liest man auch vom p aus nach außen.
double * const p
-
du hast noch probleme mit der deklaration von funktionen und -zeigern.
die C syntax ist hier sehr eigenwillig, aber wenn man das prinzip verstanden hat, ist es im grunde simpel:
- es gibt 2 arten von modifikatoren: prä- und postfix (stets bezogen auf den bezeichner, der evtl. fehlen kann) modifikatoren (ganz analog zu operatoren in ausdrücken), postfix-modifikatoren haben stets vorrang vor präfix-modifikatoren
- präfix: * & const volatile
- postfix: () []also
int *alies von rechts nach links (immer vom bezeichner weg, zeiger auf int)
int a[]zunächst die postfix-modifikatoren also ein array, dann die linke seite 'von ints'
int *a[]- analog ein array von zeigern auf int
mit zusätzlichen klammern können wir den vorrang von modfikatoren ändern:int (*a)[]ist ein zeiger auf ein array von ints
unterscheiden kannst du diesen fall (klammern benutzt um vorrang zu ändern) von funktionsdeklarationen leicht dadurch, dass hier die klammern den bezeichner umschliessen.
also
int a()eine funktion, die keine argumente hat und ein int zurückliefert
int *a()eine funktion, die keine argumente hat und einen zeiger auf int zurückliefert
int (*a)()ein zeiger auf eine funktion, die keine argumente hat und ein int zurückliefert
implizite typdefinitionen für rückgabewerte oder argumente einer funktion schreibst du auf dieselbe weise, nur lässt du einfach den bezeichner weg
wir nehmen das letzte beispiel, einen zeiger auf eine funktion, die keine argumente hat und ein int zurückliefert und wollen jetzt eine funktion, die einen solchen funktionszeiger zurückliefert:
also
int (*a)()wir lassen den bezeichner weg:
int (*)()und machen eine funktion daraus, die diesen zeiger zurückgibt:
int (*)() f()
-
hier noch was exotisches:
volatile X*const& (Y::*[])(Z(&)())const foo()
-
thomassteiner schrieb:
Bitte helft mir

Gerne, welche Probleme hast du denn?
-
thx für die antworten erstmal.
gleich mal umsetzen
-
okay, erstmal danke.
ich habe folgende ergebnisse:
1. double const* p = 0;
2. const double& (* q(char*))(int&);
3. int (r)() = s;
4. void ()() ( t[7])(int&) = {w, x, y, z};die drei ersten ausdrücke lassen sich kompilieren.
der 4. ausdruck liefert aber folgende fehlermeldung:error C2059: syntax error : ')'
wer kann mir weiterhelfen?

-
der letzte teil meines postings war unsinn ... eine solche grammatik wäre auch nicht eindeutig. richtig ist:
int (*a)()nun soll a kein einfacher bezeichner sein, sondern selbst eine funktion, also:
int (*f())()diese verschachtelung macht das ganze ziemlich schnell unübersichtlich, zum glück gibt es ja typedefs; und ein C++ programmierer muss sowas gar nicht lesen können

-
ah perfekt. dann lautet der ausdruck also:
void* (*(* t[7])(int&))();wo liegen bei so einem ausdruck aber basistyp und deklarator?
ist der basistyp einfach der am weitesten links liegende datentyp und der deklarator der rest?in diesem fall also:
basistyp: void
deklarator: * (( t[7])(int&))()