wake-up-neo.net

Ein Zeiger auf ein 2D-Array

Ich habe eine Frage zu einem Zeiger auf das 2d-Array. Wenn ein Array etwas ist

int a[2][3];

ist dies ein Zeiger auf das Array a?

int (*p)[3] = a;

Wenn dies richtig ist, frage ich mich, was [3] von int(*p)[3] bedeutet.

48
user1047092

Anstatt int[2][3] als '2d-Array' zu bezeichnen, sollten Sie es als 'Array von Arrays' betrachten. Es ist ein Array mit zwei Elementen darin, wobei jedes Element selbst ein Array mit 3 Ints ist.

int (*p)[3] = a;

Sie können p verwenden, um auf eines der beiden Elemente in a zu zeigen. p zeigt auf ein Drei-Int-Array - nämlich das erste derartige Element. p+1 würde auf das zweite Drei-Int-Array zeigen. Um p zu initialisieren, um auf das zweite Element zu zeigen, verwenden Sie:

int (*p)[3] = &(a[1]);

Im Folgenden finden Sie gleichwertige Möglichkeiten, auf den ersten der beiden Punkte zu verweisen.

int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);
36
Aaron McDaid
int a[2][3];

a wird als Array 2 von Array 3 von int gelesen, bei dem es sich einfach um ein Array von Arrays handelt. Wenn du schreibst,

int (*p)[3] = a;

Es deklariert p als Zeiger auf das erste Element, das ein Array ist. Also zeigt p auf das 3-Zoll-Array, bei dem es sich um ein Array-Element handelt.

Betrachten Sie dieses Beispiel:

        int a[2][3]
+----+----+----+----+----+----+
|    |    |    |    |    |    |
+----+----+----+----+----+----+
\_____________/
       |
       |    
       |
       p    int (*p)[3]

Hier ist p Ihr Zeiger, der auf das 3-Zoll-Array zeigt, das ein Element des Arrays von Arrays ist.

37
cpx

Nein, int (*p)[3] = a; ist kein Zeiger auf a. Es ist ein Zeiger auf das erste Element von a. Das erste Element von a ist ein Array von drei Ints. p ist ein Zeiger auf ein Array von drei Ints.

Ein Zeiger auf das Array a würde folgendermaßen deklariert:

int (*q)[2][3] = &a; 

Der numerische Wert von p und q ist wahrscheinlich (oder muss sogar derselbe sein), aber es gibt unterschiedliche Typen. Dies kommt ins Spiel, wenn Sie mit p oder q rechnen. p+1 zeigt auf das zweite Element des Arrays a, während q+1 auf den Speicher direkt hinter dem Ende des Arrays a zeigt.

Denk daran: cdecl ist dein Freund: int a[2][3] , int (*q)[2][3] .

8
Robᵩ

Der [3] ist ein Teil des Typs. In diesem Fall ist p ein Zeiger auf ein Array der Größe 3, das Ints enthält.

Der jeweilige Typ eines Arrays enthält immer seine Größe, so dass Sie die Typen int *[3] oder int *[5] haben, aber nicht nur int *[] mit undefinierter Größe.

int *x[20]; /* type of x is int *[20], not just int *[] */
int y[10][10]; /* type of y is int[10][10], not just int[][] */
5

Beachten Sie auch:

int *p[5]        // p is an array of 5 pointers

int (*p)[5]      // p points to an array of 5 ints

int (*(p+5))[10] // p is a pointer to a structure where the structure's 5th element has 10 ints .
1
sdinesh94

sie können auf ein 2d-Array wie ein 1d-Array zeigen

#include <iostream>
int main()
{
   int array[2][2] = {{0,1}, {2,3}}; // array
   int *ptr;
   ptr=(int*)array;
   std::cout << *(ptr)   << '\n';//out 0
   std::cout << *(ptr+1) << '\n';//out 1 
   std::cout << *(ptr+2) << '\n';//out 2
   std::cout << *(ptr+3) << '\n';//out 3
}
0
reza moradi