www.mikrocontroller.net

Forum: PC-Programmierung C: unterschied *(*zgr[10]) und *(*zgr)[10]


Autor: Bill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich hab eine kurze frage:
int *zgr[10]; // Zeiger-Array, Zeiger zeigen auf int Werte.

int *(*zgr)[10]; // Zeiger auf einen Zeiger, der auf ein int-Array mit der größe 10 zeigt

int *(*zgr[10]); // Zeiger auf ein Zeiger-Array, welches auf int zeigt

Ist das so richtig? Wenn nicht wie dann?

Danke

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein das letzte ist nicht korrekt. Das ist ein Zeiger auf einen Zeiger 
der auf ein int[50] Array zeigen kann.

gruß
Holger

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(1) korrekt.
(2) Zeiger auf Array von Zeigern auf int.
(3) Array aus Zeigern auf Zeiger auf int.

@beide: ausgehend von dem Variablennamen dem Vorrang folgend von innen 
nach aussen auflösen. Etwaige Danksagungen für diesen Schwachfug bitte 
an Dennis Ritchie richten.

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

Bewertung
0 lesenswert
nicht lesenswert
mir der right - left Rule   (Googeln!)

int *zgr[10];
*************

       zgr                  zgr ist ein
       zgr[10]              zgr ist ein Array (10) von

     * zgr[10]              zgr ist ein Array (10) von Zeigern
 int * zgr[10]              zgr ist ein Array (10 von Zeigern auf int


int *(*zgr)[10];
****************


        zgr                 zgr ist ein
        zgr)                zgr ist ein
       *zgr)                zgr ist ein Zeiger
      (*zgr)                zgr ist ein Zeiger
      (*zgr)[10]            zgr ist ein Zeiger auf ein Array
     *(*zgr)[10]            zgr ist ein Zeiger auf ein Array von
                            Zeigern
 int *(*zgr)[10]            zgr ist ein Zeiger auf ein Array von
                            Zeigern auf int


int *(*zgr[10]);
****************

         zgr                 zgr ist ein
         zgr[10]             zgr ist ein Array von
         zgr[10])            zgr ist ein Array von
        *zgr[10])            zgr ist ein Array von Zeigern
       (*zgr[10])            zgr ist ein Array von Zeigern
      *(*zgr[10])            zgr ist ein Array von Zeigern auf Zeiger
 int  *(*zgr[10])            zgr ist ein Array von Zeigern auf Zeiger
                             auf int


Beim Variablennamen anfangen und nach rechts gehen (wenns geht). Ein [] 
wird als 'Array von' übersetzt, ein () wird als 'Funktion übersetzt. 
Triffst du auf eine einzelne ), dann dreht sich die Lesereichtung um und 
es geht links weiter (und umgekehrt).

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

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> (1) korrekt.
> (2) Zeiger auf Array von Zeigern auf int.
> (3) Array aus Zeigern auf Zeiger auf int.
>
> @beide: ausgehend von dem Variablennamen dem Vorrang folgend von innen
> nach aussen auflösen. Etwaige Danksagungen für diesen Schwachfug bitte
> an Dennis Ritchie richten.

Danke Dennis!

(Wer sowas ohne typedef schreibt ist selber schuld :-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besonders elegant wird das, wenn es keinen Variablennamen gibt und man 
erst einmal rausfinden muss, wo der stünde wenn es einen gäbe. Dieses 
Vergnügen hat man bei Typecasts. Wie in (int *(*(*)[10])(int *zgr)).

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor vielen Jahren habe ich mal ein Tool gesehen, das die C-Notation von
Datentypen in englische Prosa übersetzt. Ich hielt so etwas damals für
uncool :), aber hier im Forum wäre es schon mehrfach von Nutzen gewesen.

Kennt das zufälligerweise jemand und hat einen aktuellen Link?

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

Bewertung
0 lesenswert
nicht lesenswert

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ direkt online: http://cdecl.org/

MfG
Marius

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:
@Marius:

Ja, genau das meinte ich. Vielen Dank an beide!

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.