www.mikrocontroller.net

Forum: Compiler & IDEs Zeigerfrage in C


Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich hab mal ne Frage zu einer speziellen Zeigerdeklaration:
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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$ cdecl                                                                  
Type `help' or `?' for help
cdecl> explain int (*api)[5]
declare api as pointer to array 5 of int

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'api' ist ein Zeiger auf ein Array bestehend aus fünf int.

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank!

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal. Hab hier noch eine härtere Nuss. Dazu spuckt auch cdecl 
nichts aus. Das folgende steht als Argument in einem Funktionsprototyp:
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?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon Huwyler (simi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
>
> $ cdecl
> Type `help' or `?' for help
> cdecl> explain int (*api)[5]
> declare api as pointer to array 5 of int
> 

sooooooooo geil! Ein Übersetzer C Gibberish <---> English

Der wird mir in Zukunft viel Kopfkratzen ersparen! :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon Huwyler schrieb:
> Hc Zimmerer schrieb:
>>
>> $ cdecl
>> Type `help' or `?' for help
>> cdecl> explain int (*api)[5]
>> declare api as pointer to array 5 of int
>> 
>
> 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

Autor: Sven S. (schwerminator)
Datum:

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

Autor: Simon Huwyler (simi)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Simon Huwyler (simi)
Datum:

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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Nico Sch. (nico22)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven, du gehst doch auf die TUHH ^^

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verdammt ich wurde durchschaut!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.