2013-08-12 16 views
5

Ich verstehe völlig was ist "int *p[3]" (p ist ein Array von 3 Zeiger bedeutet, dass wir 3 verschiedene Zeilen mit einer beliebigen Anzahl von Ints haben können durch die Zuordnung des Speichers als unsere Größe der verschiedenen Zeilen).Was ist der Unterschied zwischen int (* p) [3] und int * p [3]?

Meine Verwirrung liegt bei "int (*p)[3]" was bedeutet das? Ist es wie "p" speichert die Adresse von 3 zusammenhängenden Speicher von Int oder etwas anderes?

Bitte klären Sie und auch, wie man Gebrauch im Programm verwendet, um sie zu unterscheiden.

Vielen Dank im Voraus.

@revised 

Entschuldigen Sie, dass Sie eine doppelte Frage gestellt haben. Ich habe meine Zweifel nicht intensiv gesucht. Aber meine Zweifel bleiben immer noch als Neuling Programmierer. Ich ging durch beide Seiten von Q/A C pointer to array/array of pointers disambiguation

und

int (*p) [4]?

zweite Verbindung löscht teilweise die Zweifel so meine Zweifel beseitigen bitte oben gestellte Frage in Bezug erklären zu stapeln und Heap: zum Beispiel

int *p[3]; // (1) 

nehmen 12 (3 * 4bytes) Bytes des Stapels und für Heap hängt von der Laufzeit ab. Jetzt für

int (*p1)[3]; //(2) 

(2) unter Verwendung von "neuen" wäre man als

p1 = new int[7][3]; // (3) 

in einen der Antwort von Link int (*p) [4]? gegeben; Jetzt ist meine Frage seit "int (* p1) [3]; // (2)" ist ein Zeiger auf ein Array von 3 Ints, so wie viel Speicher von p1 zur Kompilierzeit genommen wird, wie eq (3) kann auch von

p1 = new int[n][3]; // (3) where n is an integer

so ersetzt werden, was dann?

Bitte erläutern.

+11

http://cdecl.org/ – dyp

+0

Mögliche dup von http: // stackoverflow.com/questions/3382951/int-p-4 – lurker

Antwort

13
int *p[3]; // type of p is int *[3] 

erklärt p als Array 3 von int * (dh ein Array von drei int *)

und

int (*p)[3]; // type of p is int (*)[3] 

erklärt p als ein Zeiger auf ein Feld 3 von int (dh ein Zeiger auf ein Array von drei int)

+5

Ich denke, die Formulierung wäre weniger umständlich, wenn anstelle von "Array N von T" es "Array von NT" lesen. – cdhowie

+1

Gibt es eine andere Syntax, die für die zweite Deklaration verwendet werden könnte? Etwas, das es etwas offensichtlicher machen würde, was erklärt wird. –

+1

@BenC. Wenn du C kennst, dann ist es ziemlich offensichtlich. –

3

Die Syntax für deklarati ons ist in C etwas umständlich, und die gleiche Syntax wurde von C++ geerbt. Insbesondere arrays und Funktionen wrap die Erklärung.Wenn Sie dies im Auge behalten, es könnte Ihnen helfen:

int (*p)[3]; 
    *p  // p is a pointer to 
int ()[3] // an array of 3 int 

Sie betrachten können, die Deklaration in zwei Linien zu brechen:

typedef int int3[3]; 
int3 *p; 
+0

Rodríguez Ich habe eine ernsthafte Bitte an dich. Wenn Sie alle Kommentare gelesen haben, dann nehme ich an, dass Sie die Frage, die ich Ihnen stelle, bereits kennen. Meine Frage ist seit der Aussage [int * p [3]; wird 12 Byte Speicher auf dem Stapel essen und so wird p [0] auf ein Array von Speicher zeigen, wenn er dynamisch zugewiesen wird, oder zu irgendeinem Speicher auf dem Stapel (oder einem Array), ebenso p [1], p [2]. Aber was ist mit [int (* p1) [3]; Wie viel Speicher des Stacks wird benötigt. Wie man malloc für dieses verwendet, wie für früher man kann p [0] = malloc (n0 * sizeof (int)); ähnlich für p [1], p [2], aber was ist mit int (* p1) [3]; wie man in. – zeal

+0

@zeal: Ich denke für diese ist es besser, wenn wir eine 64bit-Architektur betrachten, für die Zeiger 8bytes sind, aber "int" bleibt 4 Bytes (was eigentlich der übliche Fall ist). 'int * p [3];' ist ein Array von 3 Zeigern. Wenn es im Stapel zugeordnet ist, benötigt es 8 × 3 = 24 Bytes. Jeder der Zeiger kann auf ein "int" (oder mehrere zusammenhängende 'int's) verweisen, die an anderer Stelle gespeichert sind. 'int (* p) [3]' ist andererseits ein Zeiger auf ein Array von 3 'int'. Es wird 8 Bytes dauern, um den einzelnen Zeiger lokal zu halten, und wenn es entsprechend initialisiert wird, zeigt es auf einen Block von 4 × 3 = 12 Bytes an anderer Stelle. –

+0

Rodríguez, ok, wenn man den Fall der 64bit-Architektur [int * p [3] nimmt; wird 24 Bytes Speicher auf dem Stack brauchen, ob wir dynamische Zuweisung machen oder nicht, aber was ist mit int (* p1) [3]; Wie viel wird es auf Stapel nehmen und bitte genau, was meinst du mit woanders (ich verweise nur auf Heap). Und zeigen Sie bitte mit einem kurzen Beispiel, wie Sie malloc für diesen Fall verwenden. Danke für die frühere Antwort. – zeal

Verwandte Themen