Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
17.3 Po<strong>in</strong>ter <strong>und</strong> e<strong>in</strong>dimensionale Arrays<br />
E<strong>in</strong>dimensionale Arrays <strong>und</strong> Po<strong>in</strong>ter s<strong>in</strong>d <strong>in</strong> C sehr nahe verwandt. E<strong>in</strong> Arrayname ist <strong>in</strong> C nichts<br />
anderes als e<strong>in</strong> konstanter Zeiger auf den Anfang des Arrays. Der Indexoperator [] kann deshalb<br />
auch auf Po<strong>in</strong>ter <strong>und</strong> der * auf Arraynamen angewendet werden:<br />
Die Operation *(Ptr + n) ist äquivalent zu Ptr[n]. Zwischen den beiden Varianten kann frei<br />
gewählt werden. Für Arrays ist es aber üblich ausschliesslich [] zu verwenden, bei Zeigern wird<br />
h<strong>in</strong>gegen oft auch [] anstelle von * verwendet, <strong>in</strong>sbesondere wenn der Zeiger auf e<strong>in</strong> Array zeigt.<br />
double Tabelle[] =<br />
{1, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.1, 0};<br />
double *Ptr = Tabelle + 3; /* Zeigt nun auf 1.8 */<br />
pr<strong>in</strong>tf("%f", *(Tabelle + 4) ); /* Gibt 2.2 aus */<br />
pr<strong>in</strong>tf("%f", Ptr[2] ); /* Gibt 2.7 aus */<br />
pr<strong>in</strong>tf("%f", Ptr[-2] ); /* Gibt 1.2 aus (Negative Indices erlaubt !) */<br />
pr<strong>in</strong>tf("%f", *Ptr++ ); /* Gibt 1.8 aus, zeigt danach auf 2.2 */<br />
/* Gibt den Inhalt des gesamten Arrays aus */<br />
for (Ptr = Tabelle; *Ptr != 0.0; Ptr++) {<br />
pr<strong>in</strong>tf("%f\n", *Ptr);<br />
}<br />
/* Gibt ebenfalls den Inhalt des gesamten Arrays aus (jeweils 2 mal) */<br />
Ptr = Tabelle;<br />
for (i = 0; i < 12; i++) {<br />
pr<strong>in</strong>tf("%f\n", Tabelle[i]);<br />
pr<strong>in</strong>tf("%f\n", Ptr[i]);<br />
}<br />
17.4 Po<strong>in</strong>ter <strong>und</strong> mehrdimensionale Arrays<br />
Bei mehrdimensionalen Arrays wird <strong>die</strong> Sache schon etwas komplizierter, <strong>in</strong>t **p <strong>und</strong> <strong>in</strong>t a[][3]<br />
s<strong>in</strong>d nicht äquivalent zue<strong>in</strong>ander!<br />
Sondern der Po<strong>in</strong>ter <strong>in</strong>t (*p)[3] ist kompatibel zum Array <strong>in</strong>t a[][3].<br />
<strong>in</strong>t a[7][3];<br />
<strong>in</strong>t **p1; /* Achtung, Po<strong>in</strong>ter auf Po<strong>in</strong>ter auf <strong>in</strong>t */<br />
<strong>in</strong>t (*p2)[3]; /* Korrekt, Po<strong>in</strong>ter auf Array mit 3 Elementen */<br />
<strong>in</strong>t (*p3)[7]; /* Korrekt, Po<strong>in</strong>ter auf Array mit 7 Elementen */<br />
<strong>in</strong>t *p4[3]; /* Achtung, Array von drei Po<strong>in</strong>tern, nicht Po<strong>in</strong>ter auf Array */<br />
p1 = a; /* Nicht Korrekt */<br />
p2 = a; /* Korrekt */<br />
p3 = a; /* Nicht Korrekt, Array hat nur 3 Spalten */<br />
p4 = a; /* Nicht Korrekt */<br />
p2[5][1] = 5; /* Zugriff auf Array via Po<strong>in</strong>ter */<br />
/* Auf alle oben def<strong>in</strong>ierten Po<strong>in</strong>ter kann aber mit e<strong>in</strong>er 2-Dimensionalen */<br />
/* Indizierung zugegriffen werden, aber <strong>die</strong> darunterliegenden Datenstrukturen */<br />
/* s<strong>in</strong>d Gr<strong>und</strong>verschieden */<br />
p1[3][2] = 7; /* Korrekter Zugriff, aber nicht auf Array */<br />
p2[3][2] = 7; /* Korrekter Zugriff auf n*3 Array, passt zu a */<br />
p3[3][2] = 7; /* Korrekter Zugriff auf n*7 Array */<br />
p4[2][3] = 7; /* Korrekter Zugriff, aber nicht auf Array */<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 60/147