/* Mehr zu Reihungen und Zeigern. Insbesondere wird hier die Ähnlichkeit in der * Verwendung, aber der dahinterliegende Unterschied zwischen mehrdimensionalen * Reihungen und Reihungen von Zeigern hervorgehoben. */ #include int main(void) { int a[3][2]; /* Eine Reihung von drei Zeigern auf int. Wird initialisiert mit jeweils * Zeigern auf die ersten Elemente der ersten, zweiten und dritten Zeile von * a. */ int* pi[3] = { a[0], a[1], a[2] }; int* ri = a[0]; // Ok, die Elemente von a[0] sind vom Typ int. // Fehler! Das erste Element von a ist vom Typ int[2], nicht int*. // int** p = a; int** p = pi; // Ok, die Elemente von pi sind vom Typ int*. a[2][0] = 23; a[1][1] = 42; /* p pi a * +--+ +----+ +--+--+ * |pi| ---> |a[0]| ---> | | | * +--+ +----+ +--+--+ * |a[1]| ---> | |42| * +----+ +--+--+ * |a[2]| ---> |23| | * +----+ +--+--+ */ printf("%d\n", a[2][0]); printf("%d\n", p[2][0]); /* Igitt! a hat keine vier Spalten bzw. a[0] hat keine vier Elemente (nur * zwei). Das "vierte" Element der ersten Zeile liegt somit an der Stelle des * zweiten Elements der zweiten Zeile. */ printf("%d\n", p[0][3]); a[1000][-5]; /* Es findet keinerlei Prüfung der Grenzen statt - weder beim * Übersetzen noch zur Laufzeit. */ /* Ähnliche Situation wie zuvor, nur handelt es sich jetzt um getrennte * Reihungen und nicht um die verschiedenen Zeilen einer Reihung. * Hier tut q[0][3] (im Gegensatz zu p[0][3] oben) nichts sinnvolles, sondern * greift undefiniert in die Pampa. * Die Reihung von Zeigern kann mit jedem Eintrag auf verschieden Lange * Reihungen verweisen. Sie weiß auch nichts über deren Länge - der Typ der * Elemente von qi sind nur einfache Zeiger auf int. */ int x[2]; int y[4]; int z[2]; int* qi[3] = { x, y, z }; int** q = qi; z[0] = 42; /* * +--+--+ * q qi -> x| | | * +--+ +--+ / +--+--+ * |qi| ---> |x | - * +--+ +--+ +--+--+--+--+ * |y | ---> y| | | | | * +--+ +--+--+--+--+ * |z | - * +--+ \ +--+--+ * -> z|42| | * +--+--+ */ printf("%d\n", z[0]); printf("%d\n", qi[2][0]); printf("%d\n", q[2][0]); }