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


Anmelden zum Antworten