2012-04-15 4 views
0

Kann jemand den Weg gerade auf die Disparitäten zwischen diesen allgegenwärtigen setzen, da es ein bisschen überwältigend werden kann.Klarheit zwischen Pointer-Pointer, Pointed-Value-Adresse und 2D-Array-Zugriff

Zum Beispiel, wenn ich eine 2D Array wie rec[3][2] haben, bedeutet der folgende Zugriff dasselbe;

rec[0][0] = **rec 
rec[i][0] = **(rec + i) 
*(*(rec + i) + j) = rec[i][j] 

Wenn dies der Fall ist, dann, was die Bedeutung von ihnen sind:

#include <stdio.h> 
double *recptr[3]; 
int i=1; 

main() 
{ 
double n1=12.0; 
doublw n2=3.4; 

recptr[0]= &n1; 
recptr[1]= &n2; 

printf("Amt: %.2f\n", **(recptr + i)); 
} 

Was **(recptr + i) ist, wird dieser Zugriff auf 2D-Zeiger oder ponter-to-Zeigerverweis?

foo(ptr2ptr)double **ptr2ptr; 
{ 
int i=1, j=0; 
if(**(ptr2ptr +i) > **(ptr2ptr + j)) 
{ 
    double *tmp= *(recptr +i); 
} 
} 

wieder, was der Unterschied zwischen *(recptr +i) und **(ptr2ptr +i)?! Ist der spätere 2D-Zugriff oder -Zugriff auf Zeiger-2-Ponter-Referenz und je früher das Objekt gezeigt?

+0

möglich Duplikat [Ist Array einen Zeiger in C nennen?] (Http://stackoverflow.com/ Fragen/1641957/ist-array-name-a-pointer-in-c) –

Antwort

1
double *recptr[3]; 

Dies erzeugt ein Array von Zeigern 3 (double*) zu verdoppeln.
Jetzt, in der main(), haben wir doppelte n1 = 12.0f und doppelte n2 = 3.4f.

Jetzt vergeben wir die Adresse n1 (&n1) zu recptr[0] (Erstes Element des Arrays, das gerade auf Doppel zeigt, so dass es jetzt auf eine Adresse eines Doppel (unser n1) zeigt, was in Ordnung ist.) -> Bitte tun Beachten Sie, dass dies keine Referenz (in der Theorie) ist. Wir nehmen die Adresse von n1.

Wir machen dasselbe mit n2, also ist jetzt recptr[1] ein Zeiger, der auf die Adresse von n2 zeigt.

Jetzt drucken wir **(recptr + i) -> Das bedeutet folgendes:

Wir nehmen die Adresse des ersten Elements des Arrays (recptr an die Adresse des aray auswertet), versetzt wir diese Adresse von i (die nur passiert, 1). Bitte beachten Sie, dass wir 1 Byte nicht weiter verschieben, wir verschieben sizeof(double*) Bytes weiter.

Nun dereferenzieren wir diese Position *(recptr + i), die (Adresse des ersten Elements + sizeof(double*) Bytes) entfernt ist und was sehen wir? Nun, es ist ein Zeiger auf ein Doppel (Oder in anderen Worten, es ist nur eine Adresse von n2). Also müssen wir noch einmal deneferenzieren, um tatsächlich den Wert zu sehen, auf den dieser bestimmte Zeiger zeigt, daher **(recptr + i).

Also gibt uns die erste Dereferenz nur die korrekte "Zelle" unseres recptr-Arrays, aber in dieser Zelle gibt es einen Zeiger auf ein Double, also müssen wir noch einmal deneferenzieren, um zu seinem Wert zu kommen.

(Wir in der Tat dann 3.40 drucken, da es Adresse ist in der zweiten Zelle von recptr Array leben passiert.)

Verwandte Themen