2009-08-19 6 views
1

Je cherche une clarification concernant les pointeurs. J'ai compilé le code suivant dans bordland C++ 5.5.1 sans aucune erreur. Mais pendant que j'essaye d'exécuter donne une erreur de noyau.question pointeur de base dans le programme C++

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

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

    int *c; 
    int *d; 

    *c=x; 
    *d=y; 

return 0; 
} 

Fondamentalement, je suis en train de créer deux variables de référence (a, b) et affecté à deux variables (x, y). après cela, j'ai créé deux variables de pointeur (c, d) et essayé d'assigner les mêmes variables (x, y). Cela me donne une erreur lors de l'exection et non à la compilation.

Si je fais quelque chose de mal, ce n'est pas une assignation standard de la variable pointeur. pourquoi l'affectation du pointeur est en panne à ce stade. S'il vous plaît aidez-moi à comprendre cela.

1ère mise à jour:

Merci à tous. J'ai d'abord compris que je travaillais sur une fonctionnalité C++ (variable de référence). Deuxièmement, je dois allouer de la mémoire pour les variables de pointeur avant de jouer avec.

Répondre

7

Le code affiché est C++, pas C. Et votre problème est que vous devez faire ces pointeurs pointent en fait quelque chose:

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

L'affectation "int &a=x;" n'est donc pas prise en charge par C. corrigez-moi si je me trompe. – chinnagaja

+0

"int & a = x" déclare une référence - les références font partie de C++, pas C. –

+0

Merci Neil, le problème est que j'utilise le compilateur cpp et par défaut les fichiers sont stockés avec l'extension cpp pour que toutes les fonctionnalités C++ soient supportées lors de la compilation – chinnagaja

0

Vous avez défini deux variables pointeur c et d, mais vous n'avez pas alloué de la mémoire pour eux. Vous devez leur attribuer de la mémoire.

Faites ceci:

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

Vous avez déclaré c et d comme int pointeurs et que vous essayez de mettre à jour leurs valeurs pointues, ils ne pointent pas partout valide puisque vous ne les initialisez avec mémoire valide.

Essayez c = & x; puis jouez avec c.

2

Vous déréférencer un pointeur non valide. 'c' et 'd' n'ont pas d'emplacement de mémoire et utiliseront donc tout ce qui était auparavant dans la mémoire comme emplacement. Vous devez faire:

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

ou leur indiquer une mémoire valide, par exemple c = & x (placez c de sorte qu'il pointe vers la même mémoire que x, tout comme "int & a = x" définit a pour pointer vers la même mémoire que x) –

+1

Si vous leur attribuez de la mémoire de cette manière, assurez-vous n'oublie pas d'effacer la mémoire quand tu en auras fini avec eux. Utiliser: supprimer c; supprimer d; Également la façon de le faire dans C: int * c = (int *) malloc (sizeof (int)); Et quand c'est fait: gratuit (c); –

2

Il me semble que vous n'êtes pas entièrement clair sur la syntaxe.

Taper int *c est difficile, car il semble que vous déclariez un entier avec le nom *c. Cependant, ce n'est pas le cas. Cela va déclarer un pointeur sur un entier, et en C/C++, les pointeurs vers un certain type sont signalés en ajoutant un * après le nom du type. Ainsi, vous déclarez une variable de type int* (pointeur vers un entier), avec le nom c, même si l'espacement lui donne un aspect différent. Pour l'enregistrement, en tapant int* c donne le même résultat, et est sans doute plus lisible.

Il s'ensuit alors que le fait de taper *c ne fait pas référence à votre variable, car il s'appelle effectivement c. Au lieu de cela, ce que cela fait est de déréférencer le pointeur: il renvoie tout objet vers lequel pointe le pointeur. Ou, si le pointeur est invalide, provoque une erreur.

Si vous voulez déclarer un pointeur et le mettre à pointer vers un objet à un stade ultérieur, vous devez faire ceci:

int *c; 

// stuff goes here 

c = &x; 

&x retournera l'adresse de x en mémoire, qui peut être affecté à un pointeur en tant que valeur. Ensuite, vous pouvez manipuler la valeur à travers le pointeur en la désindiquant: par ex. .