Ich denke, der Grund int *p2 = &i;
ist verwirrend ist der kombinierte Effekt der gleichzeitigen Deklaration und Instanziierung, und der Abstand. Ich erkläre es.
Typischerweise für einen Zeiger-zu-Integer-p2
und eine ganze Zahl i
, writing "*p2
" Dereferenzierungen p2
und gibt die int
&i
an der Adresse wohnen.
Also der Code "int *p2 = &i;
" macht es wie ein int
wird gleich einer Speicheradresse gesetzt.
Tat der Code
int i = 1;
int *p2;
*p2 = &i
ist falsch, denn in der letzten Zeile, *p2
eine int
ist, da es p2
dereferenziert ist, und &i
ist ein Zeiger.
Warumint *p2 = &i;
wird als die letzte Zeile des fehlerhaften Code über die gleiche Sache nicht zu tun:
Den Code int *p2 = &i;
oben von den drei Zeilen Code anders ist, weil es eine Erklärung. Wenn Sie eine Zeigervariable deklarieren, setzen Sie den Typ (zB int
, long
, char
usw.) und den Namen Ihrer Variablen (wie üblich) - und Sie setzen auch ein Sternchen *
zwischen diesen beiden Teilen (siehe @) chqrlie Antwort oben im Hinblick auf die vielen Abstände Optionen dafür - Takehome ist Best-Practice ist es, die *
an den Variablennamen zu halten). In einer Deklaration wird der Zeiger NICHT durch *
dereferenziert. Vielmehr teilt es dem Compiler mit, dass die Variable myPointer
ein Zeiger auf den Speicher sein wird, der Daten des deklarierten Typs enthält (die int
, long
, char
usw. von zuvor).In dem Bit des Codes "int *p2 = &i;
", in dem der Zeiger zur selben Zeit deklariert und instanziiert wird, gibt *
keinen int
auf der linken Seite aus. Bei Deklarationen ist es sicherer (wie @chqrlie hervorhebt), neben dem Variablennamen den Wert *
anzugeben. Dadurch wird der Zeiger nicht ausgepackt, selbst wenn der Zeiger in der Deklaration instanziiert wird. Bei Deklarationen denken Sie an die *
als an den Typ (und nicht an den Variablennamen, wo es aus guten Gründen wahrscheinlich ist). Ich mag Zeiger mit den *
direkt neben den Zeigernamen erklären, sondern nur zu verstehen, dass, wenn ein Zeiger in der Deklaration instanziiert wird, ein vielleicht klarer Weg für einen neuen Lernende der Linie vorstellbar wäre int* p2 = &1
:
int*
(Typ pionter-to-int) p2
(Name des Zeigers) = &i
(entspricht den Zeiger, der die Adresse des integer i
) ;
Vielen Dank an alle, die an alle beantwortet und kommentiert, und viel Glück gibt, die hier sind gekommen, können versuchen, etwas über Zeiger herausfinden.
'p2' ist kein' int'. Es ist ein * Zeiger auf int *. Alle Zeiger speichern Adressen. Die Größe einer Adresse ändert sich nicht, unabhängig davon, auf was sie zeigt. – kaylum
Würde es helfen, wenn die LHs int * p2 statt int * p2 geschrieben wären? –
@kaylum: Tatsächlich können verschiedene Zeigertypen unterschiedliche Größen haben, aber das ist weit über das Niveau dieser Frage hinaus. – chqrlie