2016-07-06 12 views
-3

Während eine Zeigervariable zu definieren, verwenden wir Code, C++ Pointers Verwirrung

int *ip; 

wie

aussieht, aber wir können auch die Zeiger in der gleichen Zeile initialisieren eine zufällige definierte Variable x sagen zu zeigen.

int x; 
int *ip = &x; 

und wir können auch die Zeigervariable in einem anderen Codezeile beispielsweise initialisieren,

int x; 
int *ip; 
ip = &x; 

Meine Frage ist, dass, wenn ich *ip die Zeigervariable zu initialisieren,

int x; 
int *ip; 
*ip = &x; 

Visual Studio gibt einen Fehler:

Error C2440 '=': cannot convert from 'int *' to 'int'

Kann mir jemand bitte erklären, ich habe gerade angefangen C++ zu lernen.

+0

Welche Zeile gibt den Fehler? –

+1

Die Codezeilen, die Sie gepostet haben, funktionieren, aber Sie haben vergessen, die Codezeilen zu posten, die nicht (nicht) funktionieren. Das ist für niemanden hilfreich, der dir helfen möchte. –

Antwort

7

Bitte beachten Sie die Datentypen dort.

Wenn Sie

ip = &x; 

schreiben, ist dies ein assignment statement. Sie versuchen, die Adresse x (ein Zeiger, im Grunde int *) in ip zu speichern, die auch eine Variable des Typs Zeiger auf int (wieder int *) ist. Alles gut.

Auf der anderen Seite, wenn Sie versuchen,

*ip = &x; 

Dies ist auch eine Zuordnung zu schreiben, aber hier, *ip ist eine int Art und &x ist int * und sie sind nicht kompatibel. Daher warnt Ihr Compiler Sie für immer.


FWIW,

int *ip = &x; 

ist in Ordnung, weil diese initialization ist nicht nur ein einfaches assigment. Sie initialisieren die Variable ip (vom Typ int *) zum Zeitpunkt der Definition. Denken Sie daran, die Variable definiert zu werden und hier initialisiert ist ip, nicht *ip und das ist sehr verschieden von Schreiben

*ip = &x; 

(, die, wie ich bereits erwähnt, ungeeignet ist.)

+4

Du hast die Worte direkt aus meinem Mund genommen. –

+1

@JesperJuhl oder Ihre Tastatur? :) –

+0

schnellste Finger _ (Denker) _ zuerst :) –

0

Vorsicht: Es gibt einen Unterschied zwischen:

  • ip = &x; Hier ordnen Sie den Zeiger ip mit der Adresse des x

  • und *ip = x; Hier stellen Sie den Wert in dem ip zeigt auf, mit dem Wert x

Achtung: *ip = &x; ist eine Mischung aus beidem und deshalb wird nicht funktionieren

0

Ich denke, Ihre Verwirrung nur von der Syntax des Zeigers an der Deklarationszeile ist.

, wenn Sie einen Zeiger deklarieren, schreiben Sie int *p, was bedeutet, define symbol **p** to be of type Pointer to **int** und die Assign = wird Wert auf p Bereitstellung und nicht *p.

Wenn nicht in der Deklarationszeile, gibt es keine Verwirrung! ist der Zeiger. und *p ist der Wert.

Andere Möglichkeit, es zu sagen ... wenn die Deklaration eines Zeigers von ptr2int p = &i getan wurde, denke ich, es war klarer.

das ist der Grund, warum viele Leute eher Zeigerarten als int* p anstelle der int *p deklarieren. kleine Semantik, die Leute glücklich macht :)

Prost.