Zeigerfrage in C

OP #2039237
Lesenswert?

Moin,
ich hab mal ne Frage zu einer speziellen Zeigerdeklaration:
1
int (*api)[5];

Was genau wird da deklariert? Es ist klar, dass es ein Array der Länge 5 
ist. Aber was genau ist in jedem Element "drin"? Es ist weder ein int 
noch ein int*, das habe ich schon durch try&error herausgefunden. Ich 
hoffe, ihr könnt helfen ;)

Gruß Sven
OP #2039276
Lesenswert?

Hallo nochmal. Hab hier noch eine härtere Nuss. Dazu spuckt auch cdecl 
nichts aus. Das folgende steht als Argument in einem Funktionsprototyp:
1
double *(*(*f)[5])(int)
Das müsste doch ein Array aus Funktionszeigern der Länge 5 sein, bei dem 
die Funktionen ein int als Argument erwarten und einen Zeiger auf double 
zurückgeben. Aber da ist noch ein Sternchen mehr, von dem ich nicht 
weiß, was es macht... Kann jemand helfen?
Gast #2039284
Lesenswert?

Ein Zeiger auf ein Array von fünf Funktionszeigern. Die Funktion 
erwartet einen int und liefert einen Zeiger auf double.


Funktionsprototyp: double *F(int)
Array aus fünf Elementen: f[5]
Zeiger auf selbiges: (*f)[5]
Gast #2039287
Lesenswert?

Bedeutet nur das f ein Zeiger auf dieses Array ist.
Unter www.cdecl.org gibt es das sogar online.

was es dort allerdings mit dem block auf sich hat weiß ich nicht,
das habe ich noch nie gesehen und mein gcc wirft auch gleich 
Syntax-Error
aus. (int (^)(int))i sollte "cast i into block (int) returning int" 
sein.

Peter
#2041442
Lesenswert?

Simon Huwyler schrieb:
> Hc Zimmerer schrieb:
>>
1
>> $ cdecl
2
>> Type `help' or `?' for help
3
>> cdecl> explain int (*api)[5]
4
>> declare api as pointer to array 5 of int
5
>>
>
> sooooooooo geil! Ein Übersetzer C Gibberish <---> English
>
> Der wird mir in Zukunft viel Kopfkratzen ersparen! :-)



Such auch mal nach der rechts-links Regel.
Genau danach geht nämlich das Programm vor.

In a Nutshell
  Fang beim Variablennamen an
  dann geh nach rechts, was findest du?
  Stösst du dabei auf eine Klammer, dann wechselst du die Richtung
  und gehst anstelle von nach links dann eben nach rechts /und 
umgekehrt.


Was haben wir

int (*api)[5]


   api               api ist

   api)              Oops, Klammer, Richtung wechseln

   *api)             api ist ein Pointer

   (*api)            Klammer!, Richtung wechseln

   (*api)[          api ist ein Pointer auf ein Array

   (*api)[5]        api ist ein Pointer auf ein Array mit 5 Elementen

                    rechts geht nichts mehr, aber links

   int (*api)[5]    api ist ein Pointer auf ein Array mit 5 Elementen
                    und zwar von int.


http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html
#2041669
Lesenswert?

Coooool!

Was auf der Seite nicht beschrieben ist, ist, wie mit "const" umzugehen 
ist.

Nach meiner Logik wäre die Erweiterung noch: Wenn ein Const rechts von 
sich einen Typ sieht, bezieht es sich darauf. Wenn nicht, schaut es nach 
links. Wenn es da einen sieht, bezieht es sich darauf.

Ups, habe gerade gesehen, dass cdecl das nicht korrekt macht.

Gebt mal

int const i

ein. Das gibt 'nen Syntax-Fehler. Das wäre aber eine normale konstante 
INT "Variable" (identisch mit const int i).
#2041699
Lesenswert?

Simon Huwyler schrieb:

> Nach meiner Logik wäre die Erweiterung noch: Wenn ein Const rechts von
> sich einen Typ sieht, bezieht es sich darauf. Wenn nicht, schaut es nach
> links.

Genau anders rum.
const (und auch volatile) wirken immer auf das links von ihnen stehende. 
Es sei denn sie sind schon ganz links, dann beziehen sie sich auf das 
rechts von ihnen stehende


  const int * pPtr;

ist identisch zu

  int const * pPtr;

aber unterschiedlich zu

  int * const pPtr;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren