Felder mit negativen Indizes



  • Liebe Experten,

    ich habe eine Frage zu einem c-Beispielprogramm (so ähnlich im Internet gefunden), mit dem man Felder mit negativen Indizes erzeugen und direkt verwenden kann. Dies ist wahnsinning praktisch, da man sich somit nicht mehr um Indexverschiebungen etc. sorgen muss.

    Dieses Programm soll eine 5x3 Matrix erzeugen, deren Indizes ab -2 bzw. -1 losgehen können.

    Ich kenne mich mit Zeigern nicht gut aus und habe daher zwei Varianten gepostet. Beide scheinen zu funktionieren, aber nur eine kann wirklich richtig sein (wenn überhaupt). Könnt ihr mir sagen welche es ist oder ob beide falsch sind?

    Diese:
    [cpp]
    double arr[5][3];
    double (ptr)[5]= (double()[5])&arr[2][1];

    ptr[-2][-1]=5.9;

    printf("%f\n",ptr[-2][-1]);
    [/cpp]

    oder diese:

    [cpp]
    double arr[5][3];
    double (ptr)[3]= (double()[3])&arr[2][1];

    ptr[-2][-1]=5.9;

    printf("%f\n",ptr[-2][-1]);
    [/cpp]

    Vielen Dank schon mal!



  • Um mir deine Beispiele anzugucken, hab ich keine Zeit, weils jetzt ab in die Disco geht aber du musst nen Zeiger x vorher um n Stellen inkrementieren, damit du mit x[-n] auf gültigen Speicherbereich zeigst ( x[-n] entspricht *(x - n), (n>0) ) weil in C Arrays bei 0 beginnen.



  • Bei einem 2D-Array der Art arr[5][3]; kannst du mit arr[i][j]; als auch mit *(ptr + i*3 + j) auf die Elemente zugreifen.

    Wie du siehst, muss zur Berechnung des Index die Größe des letzten Elemnts bekannt sein. Das wäre die 3.

    Zudem willst du ja auch mit ptr[-2][-1] auf das erste Element von arr zugreifen. Also sollte die Differenz schon gleich sein. Also
    Bei arr: 23+1 = 7
    Bei ptr1: 2
    5+1= 11 passt nicht
    Bei ptr2: 2*3+1= 7 passt

    Also ist die Variante 2 richtig.

    Das bei dir beides zu funktionieren scheint, liegt daran, dass du etwas an eine Stelle schreibst und gleich wieder ausliest.
    Besser wäre es doch das Array arr zu füllen und über ptr auszulesen.
    Wenn das für allle Elemente passt, sollte es richtig sein.

    double arr[5][3];
    double (*ptr)[3]= (double(*)[3])&arr[2][1];
    
    //ptr[-2][-1]=5.9;
     arr[0][0]=5.9;
    
    printf("%f\n",ptr[-2][-1]);
    

    Für alle Elemente darfst du machen 🙂



  • Vielen Dank, DirkB! Deine Erklärung ist sehr anschaulich.


Anmelden zum Antworten