Forum: Compiler & IDEs Zeigerfrage in C


von Sven S. (schwerminator)


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

von Hc Z. (mizch)


Lesenswert?

1
$ cdecl                                                                  
2
Type `help' or `?' for help
3
cdecl> explain int (*api)[5]
4
declare api as pointer to array 5 of int

von Sven P. (Gast)


Lesenswert?

'api' ist ein Zeiger auf ein Array bestehend aus fünf int.

von Sven S. (schwerminator)


Lesenswert?

Besten Dank!

von Sven S. (schwerminator)


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?

von Sven P. (Gast)


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]

von Peter (Gast)


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

von Simon H. (simi)


Lesenswert?

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! :-)

von Karl H. (kbuchegg)


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

von Sven S. (schwerminator)


Lesenswert?

Genial. Vielen Dank an alle. Übrigens hatte ich schlicht das 'explain' 
vergessen, weswegen mir dauernd ein Syntax-Fehler bei cdecl ausgegeben 
wurde...

von Simon H. (simi)


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).

von Karl H. (kbuchegg)


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;

von Simon H. (simi)


Lesenswert?

stimmt..... wenn ich rechts von Max stehe, steht Max ja links von mir. 
Wollte es erst andersrum formulieren. :-)

von Mark B. (markbrandis)


Lesenswert?

Karl heinz Buchegger schrieb:
> http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html

Ha, der Link ist mal richtig gut. Und man versteht's sogar :-)

von Nico S. (nico22)


Lesenswert?

Sven, du gehst doch auf die TUHH ^^

von Sven S. (schwerminator)


Lesenswert?

Verdammt ich wurde durchschaut!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.