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


von Bill (Gast)


Lesenswert?

Hallo ich hab eine kurze frage:
1
int *zgr[10]; // Zeiger-Array, Zeiger zeigen auf int Werte.
2
3
int *(*zgr)[10]; // Zeiger auf einen Zeiger, der auf ein int-Array mit der größe 10 zeigt
4
5
int *(*zgr[10]); // Zeiger auf ein Zeiger-Array, welches auf int zeigt

Ist das so richtig? Wenn nicht wie dann?

Danke

von Holger (Gast)


Lesenswert?

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

gruß
Holger

von (prx) A. K. (prx)


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.

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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

von (prx) A. K. (prx)


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

von Yalu X. (yalu) (Moderator)


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?

von Karl H. (kbuchegg)


Lesenswert?


von Marius W. (mw1987)


Lesenswert?

Alternativ direkt online: http://cdecl.org/

MfG
Marius

von Yalu X. (yalu) (Moderator)


Lesenswert?

@Karl Heinz:
@Marius:

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

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.