2016-07-12 30 views
1

Ich lese "Der neue Ansatz" und traf eine nette Theorie. Was ist der Unterschied zwischen a[0] und &a[0], in einem zweidimensionalen Array a[i][j].Mehrdimensionale Arrays und Zeiger

Es folgt wie:

int a[NUM_ROWS][NUM_COLS], *p, i; 

for(p = a[i]; p < a[i] + NUM_COLS; p++) 
*p = 0; 

Die andere Sache geht wie:

int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i; 

for(p = &a[0]; p < &a[NUM_ROWS]; p++) 
(*p)[i] = 0; 

Was ist der Unterschied zwischen a[0] und &a[0]?

Antwort

1

die Erklärung gegeben

T a[N][M]; // for any type T 

die folgenden Bedingungen erfüllt sind:

Expression  Type   Decays to   Value 
----------  ----   ---------   ----- 
     a  T [N][M]  T (*)[M]    Address of a[0] 
     &a  T (*)[N][M]  n/a     Address of a 
     *a  T [M]   T *     Address of a[0][0] 
     a[i]  T [M]   T *     Address of a[i][0] 
    &a[i]  T (*)[M]  n/a     Address of a[i] 
    *a[i]  T    n/a     Value of a[i][0] 
    a[i][j]  T    n/a     Value of a[i][j] 
    &a[i][j]  T *    n/a     Address of a[i][j] 

a, &a, a[0], &a[0] und &a[0][0] alle Erhalte den gleichen Wert (die Adresse eines Arrays ist die gleiche wie die Adresse des ersten Elements des ar Ray), aber die Typen der Ausdrücke sind unterschiedlich.

so dass die obige Erklärung gegeben, der Ausdruck a[0] hat T [M] (M -Glied Array von T) -Typ, die als „abklingt“ T * eingeben, wenn es der Operanden des sizeof Anbieters. Der Ausdruck &a[0] hat den Typ T (*)[M] (Zeiger bis M -Elementarray T).

Angenommen die Erklärungen

T a[N][M]; 
T *p0 = a[0]; 
T (*p1)[M] = &a[0]; 

Anfänglich p0 und p1 denselben Wert (die Adresse des a[0][0]) enthalten. Wenn wir jedoch den folgenden Code ausführen:

p0++; 
p1++; 

dann p0 wird die Adresse a[0][1] enthalten, während p1 die Adresse a[1][0] enthält. p0++ rückt p0 vor, um auf das nächste Objekt vom Typ T zu zeigen, während p1++ auf das nächste Objekt des Typs T [M] verweist.

+0

JETZT VERSTEHE ICH ALLES. Vielen Dank! –

4

a[0] ist die erste Zeile im 2D-Array und hat den Typ int [NUM_COLS].

&a[0] ist die Adresse dieser Zeile und hat den Typ int (*)[NUM_COLS].

Im ersten Codebeispiel ist vom Typ int *. Da in bestimmten Kontexten ein Array in einen Zeiger auf das erste Element zerfällt, ist es zulässig, p = a[i] zu tun. Dann sind p[n] und a[i][n] gleich.

Wenn das erste Codesegment die for-Schleife durchläuft, erhöht es die Zahl p bei jeder Iteration um eins, sodass es auf ein nachfolgendes Element in der Zeile zeigt. Der erste Codeblock setzt also jedes Element in der Zeile i auf 0.

Im zweiten Beispiel ist vom Typ int (*)[NUM_COLS], daher können Sie ihm die Adresse einer Zeile zuweisen. Wenn die Schleife iteriert, wird inkrementiert, so dass es auf die nächste Zeile zeigt. So dass Codeblock setzt jedes Element in der Spalte i auf 0

+1

Sie verwechseln Zeilen und Spalten. 'a [0]' ist die erste Zeile usw. – Olaf

+0

@Olaf Guter Fang. Fest. – dbush

+0

Nicht behoben! 'a [0]' hat den Typ 'int [NUM_COLS]', usw. – Olaf

Verwandte Themen