Array-Adresse und Pointer Zieladresse vergleichen
-
Hi,
ich möchte gerne die Zieladresse eines Pointers und die Adresse eines Arrayelementes vergleichen, dabei ist p ein int-Pointer und board ein int Array der Größe 10x10.
//... if (p > &(board + 40)) *p++ = ++i; else (p < &(board + 60)) *p++ = ++i + 1; //...
//... if (p > board + 40) *p++ = ++i; else (p < board + 60) *p++ = ++i + 1; //...
Was genau mache ich falsch, wie geht es richtig?
-
else if.
-
oh man,
ich bin verrückt geworden wegen des Fehlers, kA es gibt Tage da sollte man einfach mal kurz an die frische Luft gehen...
-
Dagegen hilft: Compilerwarnungen aktivieren (hoher Level) und auch beachten.
-
Wenn dein Array als
int board[10][10];
definiert ist, warum rechnest du dann board+40. Die Adresse liegt außerhalb des Arrays.
-
Die Adresse liegt außerhalb des Arrays.
weil 40 > 100 ?
-
Nein, weil 40 > 10.
-
int board[10][10];
ist doch vom Speicheraufbau gleich zu int board[100]
und board+40 ist dann eben board[4][0] - oder?
-
Laut http://cdecl.org/ ist
int board[10][10];
"declare board as array 10 of array 10 of int"board ist als o ein Arry mit 10 Elementen aus einem int-Array aus 10 Elementen.
board[0] ist das erste Array, board[9] das zehnte. (Das ist eine Adresse vom Typ int[10] )
board[0][0] ist das erste Element vom ersten Array, board[9][0] erste Element vom zehnten Array. (das ist ein int)Vom Speicheraufbau ist es identisch, aber nicht vom Typ.
-
Und als Nachtrag zu DirkB noch die Erklärung, was aus der anderen Typisierung folgt:
board+40
Da board ein int[10][10] ist, wird es in diesem Ausdruck als ein(*int)[10]
(ein Zeiger auf ein Array von 10 ints) aufgefasst. Und wenn man zu solch einem Zeiger die Zahl 40 addiert, so kommt man 40 Längen vonint[10]
weiter. Und das ist weit außerhalb des Arrays.Array to pointer decay bedeutet nicht, dass rigoros alle Arrays als Pointer aufgefasst werden. Beziehungsweise es bedeutet genau das, aber ihr vergesst eine wichtige Tatsache: Ein Pointer bleibt ein Pointer! Ein Pointer auf ein Array wird nämlich nicht als ein Pointer auf einen Pointer aufgefasst (das wäre auch ziemlich sinnlos, denn ein Array ist kein Pointer!). Das zweidimensionale Array wird daher in Ausdrücken nicht zum Doppelpointer.