2016-11-15 6 views
3

Ich habe gelernt, dass der Name des Arrays tatsächlich die Adresse array_name[0] ist. Dann ist es erforderlich, ein Und-Zeichen vor dem Namen des Arrays hinzuzufügen, während ein Zeiger auf das Array initialisiert wird.Initialisierung des Zeigers auf Array

int (*pointer_name)[5] = &array_name; 

Ich habe versucht:

int *pointer_name = array_name; 

und es funktioniert gut. Was ist der Unterschied zwischen den beiden anderen als der "Typ des Zeigers"? Und was sind auch die Vor-Nachteile von ihnen beiden. Wann man sie benutzt? Hat jemand von ihnen eine größere/bessere Funktionalität als andere?

+0

"Ich habe gelernt, dass der Name des Arrays tatsächlich die Adresse von array_name [0]" ist. Du hast falsch gelernt. Der Array-Name kann in bestimmten Kontexten, aber nicht in allen Kontexten, als * (* so tun, als sei er *) ein Zeiger auf 'array_name [0]' sein. Und Sie können definitiv nicht sagen, dass der Name des Arrays * die Adresse von 'array_name [0]' ist. – AnT

Antwort

2

Dann warum ist erforderlich, kaufmännisches Zeichen [..] hinzuzufügen. Ich habe es versucht: int * pointer_name = array_name; Und es funktioniert gut.

Da die Typen sind unterschiedlich.

  • &array_name ist ein Zeiger auf ein Feld von 5 ints und hat ein: int (*)[5].

  • array_name wird in einen Zeiger auf das erste Element umgewandelt wird, wenn man es zu pointer_name zuweisen (die &array_name[0] äquivalent ist) und hat Typ: int*.

Wenn array_name ist ein Array von 5 ints dann beide:

int (*pointer_name)[5] = &array_name; 

und

int *pointer_name = array_name; 

gültig sind. Wie Sie später durch diese beiden Zeiger darauf zugreifen würden, ist anders.

+0

Ich habe überprüft. Beide Arten von Pointer haben eine Größe von 8 Byte. Und der von ihnen gespeicherte Wert ist auch derselbe. Was ist der Unterschied zwischen den beiden? Sind sie in Bezug auf Funktionalität gleich? –

+0

Die Adresse ist gleich ('& array_name == & array_name [0] == array_name'). Aber wie Sie auf dieses Array zugreifen können, ist unterschiedlich. Mit 'int * pointer_name = array_name;' können Sie darauf zugreifen wie: 'pointer_name [0]/* array_name [0] * /' oder '* pointer_name/* array_name [0] * /; * (zeiger_name + 1)/* array_name [1] */'. Mit 'int (* pointer_name) [5] = & array_name;' können Sie darauf zugreifen: '(* pointer_name) [1];/* array_name [1] */'. Beide Wege sind in Ordnung. Der Hauptunterschied besteht jedoch darin, wie die Zeigerarithmetik bei diesen Typen funktioniert. – usr

3
int *pointer_name = array_name; 

deklariert einen Zeiger auf die intarray_name zur ersten int des Arrays zeigt.

int (*pointer_name)[5] = &array_name; 

deklariert einen Zeiger auf ein Feld von 5 s int die array_name dem Array verweist.

Adressen sind die gleichen, aber Typen nicht.

Wenn Sie Zeigerarithmetik auf die Sie verwenden, im ersten Fall haben:

pointer_name++; 

wird auf die zweiten int braucht nur mit der Anordnung, während im zweiten Fall wird kurz nach dem ganzen Punkt Array.

0

Der Typ des Objekts, auf den der Zeiger wie

erklärt
int (*pointer_name)[5] = &array_name; 

int[5] ist. Dies bedeutet beispielsweise, dass dieser Operator

sizeof(*pointer_name) 

den Wert gleich 5 * sizeof(int) ergibt. Und wenn die Zeigerarithmetik zum Beispiel pointer_name + 1 verwendet wird, ist die durch diesen Ausdruck erhaltene Adresse gleich der Adresse, die in dem Zeigerpluswert von 5 * sizeof(int) gespeichert ist.

Der Typ des Objekts, auf den der Zeiger wie

erklärt
int *pointer_name = array_name; 

int ist. Dies bedeutet beispielsweise, dass dieser Operator

sizeof(*pointer_name) 

den Wert gleich sizeof(int) ergibt. Und wenn die Zeigerarithmetik beispielsweise pointer_name + 1 verwenden soll, dann ist die durch diesen Ausdruck erhaltene Adresse gleich der Adresse, die in dem Zeiger plus Wert von sizeof(int) gespeichert ist.

Ein Zeiger erklärte wie diese

int (*pointer_name)[5]; 

Regel für zweidimensionalen Arrays verwendet, die auf „Zeilen“ des Arrays zeigt.

Zum Beispiel

int array_name[2][5]; 

int (*pointer_name)[5] = array_name; 

// outputs 20 provided that sizeof(int) is equal to 4 
printf("%zu\n", sizeof(*pointer_name)); 

// outputs 4 provided that sizeof(int) is equal to 4 
printf("%zu\n", sizeof(**pointer_name)); 

pointer_name zeigt auf die erste Zeile des Arrays array_name. pointer_name + 1 zeigt auf die zweite Zeile des Arrays.

+0

In der zweiten Zeile des Code-Snippets direkt darüber, die das Zeichen kaufmännisches Und-Zeichen vor "array_name" nicht verwendet haben. Warum ist dieser Adressoperator hier nicht erforderlich? Und jemand erwähnte es auch in den Kommentaren: "Und du kannst definitiv nicht sagen, dass der Name des Arrays die Adresse von array_name [0] ist," warum ist das so? –

+0

@ShawAnkush Ich habe nicht verstanden, was Sie fragen. Wenn Sie meinen, dieses Code-Snippet int array_name [2] [5]; int (* pointer_name) [5] = array_name; dann ist kein kaufmännisches Und-Zeichen erforderlich. –