2009-08-19 9 views
1

Ich suche nach einer Erklärung bezüglich der Zeiger. Ich habe den folgenden Code in Bordland C++ 5.5.1 ohne Fehler kompiliert. Aber während ich versuche auszuführen, gibt es einen Kernfehler.grundlegende Zeigerfrage in C++ Programm

int main() 
{ 
    int x=10,y=20; 

    int &a=x; 
    int &b=y; 

    int *c; 
    int *d; 

    *c=x; 
    *d=y; 

return 0; 
} 

Grundsätzlich versuche ich zwei Referenzvariablen (a, b) zu erstellen und mit zwei Variablen (x, y) zugewiesen. Danach habe ich zwei Zeigervariablen (c, d) erstellt und versucht, dieselben Variablen (x, y) zuzuweisen. Das gibt mir Fehler während der Ausführung und nicht beim Kompilieren.

ob ich falsch mache, dies ist keine Standardzuweisungen von Zeigervariable. warum die Zeigerzuweisung an diesem Punkt fehlschlägt. Bitte hilf mir das zu verstehen.

1. Update:

Danke an alle. Zuerst habe ich verstanden, dass ich an einer C++ - Funktion (Referenzvariable) arbeite. Zweitens muss ich Speicher für die Zeigervariablen reservieren, bevor ich damit spiele.

Antwort

7

Der Code, den Sie geschrieben ist C++, nicht C. Und Ihr Problem ist, dass Sie diese Zeiger weisen tatsächlich auf etwas machen müssen:

int * c = & x; // make c point at x 
* c = 42;  // changes x 
+0

Die Zuordnung "int &a=x;" wird von C. nicht unterstützt. Korrigiere mich, wenn ich falsch liege. – chinnagaja

+0

"int & a = x" deklariert eine Referenz - Referenzen sind Teil von C++, nicht C. –

+0

Dank Neil, das Problem ist, ich benutze cpp Compiler und standardmäßig werden die Dateien mit cpp Erweiterung gespeichert, so dass alle C++ Funktionen unterstützt werden bei der Kompilierung – chinnagaja

0

Sie zwei Zeigervariablen c und d definiert haben, aber sie haben nicht Jedem Speicher wurde ein Speicher zugewiesen. Sie müssen beiden Speicherplatz zuweisen.

tun:

int *c = &x; 
int *d = &y; 
2

Sie haben erklärt, c und d als int Zeiger und Sie versuchen, ihre spitzen Werte zu aktualisieren, sie verweisen auf nicht überall gültig, da Sie nie mit gültigen Speichern initialisieren.

Versuchen Sie c = & x; und dann mit c spielen.

2

Sie deaktivieren einen ungültigen Zeiger. 'c' und 'd' haben keinen Speicherplatz zugewiesen und verwenden daher den Speicherort als Speicherort. Sie müssen Folgendes tun:

int *c = new int; 
int *d = new int; 
+2

Oder verweisen Sie sie auf einen gültigen Speicher, z c = & x (setze c so, dass es auf den gleichen Speicher wie x zeigt, genauso wie "int & a = x" auf denselben Speicher wie x zeigt) –

+1

Wenn du ihnen Speicher auf diese Weise zuordnest, vergewissere dich, dass du nicht weißt Vergiss nicht, die Erinnerung zu löschen, wenn du mit ihnen fertig bist. Benutzen: Löschen c; d löschen; Auch die Möglichkeit, dies in C zu tun: int * c = (int *) malloc (sizeof (int)); Und wenn fertig: frei (c); –

2

Es sieht für mich wie Sie nicht ganz klar auf die Syntax.

Die Eingabe int *c ist schwierig, weil es so aussieht, als würden Sie eine Ganzzahl mit dem Namen *c deklarieren. Dies ist jedoch nicht der Fall. Dies deklariert einen Zeiger auf eine Ganzzahl, und in C/C++ werden Zeiger auf einen bestimmten Typ durch Anhängen einer * nach dem Typnamen bezeichnet. Daher deklarieren Sie eine Variable vom Typ int* (Zeiger auf eine Ganzzahl) mit dem Namen c, obwohl der Abstand es anders aussehen lässt. Für die Aufzeichnung ergibt die Eingabe int* c das gleiche Ergebnis und ist wohl besser lesbar.

Es folgt dann, dass die Eingabe *c bezieht sich nicht auf Ihre Variable, wie es eigentlich c heißt. Stattdessen wird der Zeiger dereferenziert: Er gibt das Objekt zurück, auf das der Zeiger zeigt. Oder, wenn der Zeiger ungültig ist, einen Fehler verursachen.

Wenn Sie einen Zeiger deklarieren möchten und legen Sie es zu einem späteren Zeitpunkt zu einem Objekt zu verweisen, müssen Sie dies tun:

int *c; 

// stuff goes here 

c = &x; 

&xx zurückkehren wird ‚s Adresse in Speicher, der sein kann einem Zeiger als Wert zugewiesen. Dann können Sie den Wert durch den Zeiger manipulieren, indem Sie ihn dereferenzieren: z.B. *c = 15.