Zeiger auf ein mehrdimensionales Array
-
Ich hoffe, ihr könnt mir helfen. Es geht um folgenden Code:
int a[3][3], *za; a[2][1]=666; za = &a[0][0] + (2*3 + 1 )*sizeof(int); printf("%d\n", *za);
Ich bekomme hier nicht 666 raus. Warum???
Nicht mal das klappt hier:
int a[3][3], *za; a[0][1]=666; za = &a[0][0] + (0*3 + 1 )*sizeof(int); printf("%d\n", *za);
Wo liegt denn der Fehler? Es muss irgendwie gehen, mein Professor hat die Zeilen in seiner Vorlesung benutzt.
-
es liegt an der Pointerarithmetik. Mach die *sizeof(int) weg.
int arr[] = {0, 1, 2, 3, 4, 5}; int *ptr = arr; int i; for(i=0; i < sizeof(arr) / sizeof(int); ++i) { printf("ptr = %p, val = %d\n", ptr, *ptr); ptr++; }
Am Bsp erkennt man, dass beim ptr = ptr + 1; der Compiler den Zeigerinhalt bereits richtig gesetzt hat. D.h. ein ptr = ptr + sizeof(int) bewirkt, dass ptr auf arr[sizeof(int)] zeigt und nicht auf arr[1].
-
ja, ok. mit dieser schleife kann ich auf ein mehrdimensionales array gut zugreifen.
gibt es denn einen ein-zeiler, mit dem ich beispielsweise auf arr[2][1] direkt zugreifen kann? wie ich sehe wird mit der schleife das ganze array durchgelaufen.
man kann ja nicht immer eine for-schleife benutzen.int arr[][3]={{1,2,3},{4,5,6},{7,8,9}}; int *ptr = &arr[0][0]; int i; for(i=0; i < sizeof(arr) / sizeof(int); ++i) { printf("ptr = %p, val = %d\n", ptr, *ptr); ptr++; }
-
n0witzness schrieb:
gibt es denn einen ein-zeiler, mit dem ich beispielsweise auf arr[2][1] direkt zugreifen kann? wie ich sehe wird mit der schleife das ganze array durchgelaufen.
Im Prinzip genauso wie du oben gemacht hast, allerdings ohne sizeof(int).
-
ja, jetzt klappt es wie ich es will. danke.