2016-01-30 21 views
6

Ich lerne über Zeiger:Zeiger auf 2D-Arrays C, C++

int x[10]; 
int *p = &x 

dies einen Zeigertyp int auf das erste Element machen würde. Also, wenn ich 2D-Array hätte, muss ich Doppelzeiger verwenden: der erste Zeiger würde auf die zweite Dimension des Arrays zeigen. Das bedeutet:

int x[3][4] = {{1,2,3,4},{5,6,7,8},{9,9,9,9}}; 

und wenn ich darauf hinweisen möchte, muss ich die Größe der zweiten Dimension wie folgt deklarieren, oder?

int *p[4] = x; 

oder gibt es eine andere Art und Weise durch die Eingabe: int **p; ?

und int *p[4] ist Array von Integer-Zeigern, die 4 * (sizeof(int*)), rechts dauert?

+1

Nur beiseite: Versuchen Sie alle Zeiger in C++ zu vermeiden. Verwenden Sie 'std :: vector' oder' std :: array' anstatt C-artigen Arrays. – xtofl

+0

"_'int * p [4]' ist ein Array von Integer-Zeigern, die '4 * (sizeof (int *))', richtig? _ "- Ja. Und ** immer ** kompilieren mit aktivierten Warnungen ('-Wall -Wextra'). Beim Kompilieren von Code werden Warnungen zu inkompatiblen Zeigertypen angezeigt. Somit gibt es Ihnen einen Hinweis darauf, dass etwas nicht stimmt. –

+0

gut .. mingw32-g ++. Exe -o ............................ Prozess beendet mit Status 0 (0 Minuten, 0 Sekunden) 0 Fehler, 0 Warnungen (0 Minuten, 0 Sekunden) und: int x [3] [4] = {{1,2,3,4}, {5,6,7,8 }, {9.987,9,9}}; int (* p) [4] = x; printf ("% d", p [2] [1]); printf ("\ nsize von * p ist:% d \ n", sizeof (p)); ------------------------------------------------- ------------- Ausgabe: Größe von * p ist: 4 –

Antwort

8

this would make a pointer type (int) to first element ..

No.
&x ist die Adresse des Arrays x und ist vom Typ int (*)[10] und man kann es nicht zu einer int * zuordnen. Beide sind inkompatible Typen.

So, if I had 2D array, I need to use double pointer: first pointer would point to the second dimension of the array.

No.
In Ausdrücken umgewandelt Arrays auf seiner ersten Elemente auf Zeiger außer wenn ein Operand von sizeof und unärer Operator &. Daher wird in diesem Fall der Typ x nach der Konvertierung int (*)[4] sein. Sie benötigen einen Zeiger auf ein Array von 4 int anstelle eines Arrays von 4 Zeiger

int (*p)[4] = x; 
+0

gut ,, yeah .. Ich habe den Zeiger auf eine ganze Zahl .. was ist das erste Element des Arrays x .. und meine Frage ist wirklich das: int (* p) [4] = x; ist das ^^^ 4 Zeiger (Array von Zeigern) oder 1 Zeiger? –

+0

'in * p [4]' deklariert ein Array von * 4 Zeigern *. 'p' ist hier ein Array. – haccks

+0

dann warum Größe (p) ist 4? es sollte 16 sein .. –

3

hinzuzufügen, das erste Beispiel ist nicht korrekt.

x ist ein Array von 10 Zoll. ist ein Zeiger auf int und kein Zeiger auf ein Array von 10 Zoll. Bei Zuordnung zu wird x zum Typ Zeiger auf int deklatiert.

sollte die Zuordnung einfach sein:

int* p = x; 
-2
// Here is not complicated matrix of size 
int p[2][4]={ 
       {1,2,3,4}, 
       {5,6,7,8} 
      }; 
// points to the first Elements :: ptr 
int (*ptr)[0] = &p; 
// Now have the same adresse (ptr and p) 
printf("Hello world! %d \n",ptr[1][3]); // show 4 
+2

Untitled1.cpp | 35 | error: kann 'int (*) [2] [4]' nicht in 'int (*) [0]' in Initialisierung | umwandeln –

1

Programm Beispiel:

#include <stdio.h> 
main(int argc, char* argv[]) 
{ 
    int x[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 987, 9, 9 } }; 
    int(*p)[4] = x; printf("p[2][1] %d", p[2][1]); 
    printf("\nsizeof(p) is : %d \nsizeof(*p) is : %d\n", sizeof(p), sizeof(*p)); 
} 

Ausgabe

p[2][1] 987 
sizeof(p) is : 4 
sizeof(*p) is : 16 

In meinem System (wie in Ihrem) sind int und Zeiger 32 Bits. Also ist die Größe eines Zeigers 4 und die Größe eines int ist auch 4.

p ist zuerst ein Zeiger. Kein Array. Ein Zeiger. Es ist Größe ist 4 nicht weniger nicht mehr.Das ist die Antwort auf Ihre Frage

Jetzt nur einige nützliche Informationen hinzuzufügen:

p ist ein Zeiger auf ein Array von 4 ganzen Zahlen. Die Größe dessen, was zeigt, ist 4 * 4 == 16. (Versuchen Sie int zu short im Beispielprogramm zu ändern, Sie sizeof(*p) is : 8 haben werden)

I p=x zuweisen können, da der Typ richtig ist, jetzt p enthält die Adresse von x und p [0] ist das gleiche wie x [ 0] (dasselbe Array von 4 int). p[2][3] ist das gleiche wie x[2][3] und *(p[2]+3). p[2] zeigt auf das Element 2 von x und p[2]+3 zeigt auf das Element 3 von x[2]. (alle Indizierung ist 0 basiert)