/* Einige Beispiele zu Zeigern. Insbesondere geht es hier um den Unterschied * zwischen Zeigern auf das erste Element einer Reihung und Zeigern auf eine * Reihung. */ #include int main(void) { int a[10]; int* p = a; // Zeiger auf das erste Elemnt, a: Kurzform von &a[0]. int (*q)[10] = &a; // Zeiger auf die Reihung. // Zeigen auf selbe Adresse, haben aber verschiedene Typen! printf("%p %p\n", p, q); ++p; // p zeigt jetzt auf das zweite Element von a. ++q; // q zeigt jetzt hinter a. printf("%p %p\n", p, q); #if 1 int b[10][2]; // Ein Zeiger auf die erste Zeile, deren Typ int[2] ist, der Reihung b. int (*r)[2] = b; // b: Kurzform von &b[0]. #else // Dasselbe mit typedef. typedef int int2[2]; int2 b[10]; /* Ein Zeiger auf die erste Zeile, deren Typ int2 - ein Alias für int[2] - * ist, der Reihung b. */ int2* r = b; // b: Kurzform von &b[0]. #endif printf("%p\n", r); ++r; // r zeigt jetzt auf das zweite Element von b, d.h. auf die zweite Zeile! printf("%p\n", r); int* s = b[0]; // b[0]: Kurzform von &b[0][0]. printf("%p\n", s); ++s; /* s zeigt jetzt auf das zweite Element von b[0], d.h. die zweite Spalte * der ersten Zeile. */ printf("%p %p\n", &b[0][1], s); ++s; /* Unschön! s läuft über das Ende der ersten Zeile hinaus in die zweite * Zeile. */ printf("%p %p\n", &b[1][0], s); }