2010-02-24 4 views
16

Je le struct suivant:C++ Pointers. Comment affecter une valeur à une structure de pointeur?

typedef struct{ 
    int vin; 
    char* make; 
    char* model; 
    int year; 
    double fee; 
}car; 

Puis-je créer un pointeur de type voiture

car *tempCar; 

Comment puis-je attribuer des valeurs aux tempCar? J'ai des problèmes

 tempCar.vin = 1234;   
     tempCar.make = "GM"; 
     tempCar.year = 1999; 
     tempCar.fee = 20.5; 

Le compilateur ne cesse de dire tempCar est de type voiture *. Je ne sais pas ce que je fais mal

Répondre

25

Vous devez utiliser l'opérateur -> sur les pointeurs, comme ceci:

car * tempCar = new car(); 
tempCar->vin = 1234; 
tempCar->make = "GM"; 
//... 
delete tempCar; 

En outre, ne pas oublier de allouer de la mémoire pour tempCar si vous utilisez un pointeur comme celui-ci. C'est ce que 'new' et 'delete' font.

+3

+1 pour le rappel pour allouer la mémoire –

+3

Vous n'avez pas forcément besoin d'allouer de la mémoire ici. Le pointeur peut pointer sur une structure locale sur la pile. 'voiture ferrari; tempCar = & ferrari; ' – Seth

+0

Notez que c'est probablement le code C dû à la structure typedef explicitement. – alternative

5

tempCar->vin = 1234

L'explication est assez simple: car* est un pointeur sur car. Cela signifie que vous devez utiliser l'opérateur -> pour accéder aux données. Par ailleurs, car* doit être alloué si vous voulez l'utiliser.

L'autre solution consiste à utiliser une déclaration telle que car tempCar;. La structure car est maintenant sur la pile que vous pouvez utiliser aussi longtemps que vous êtes dans cette portée. Avec ce type de déclaration, vous pouvez utiliser tempCar.vin pour accéder aux données.

+0

Déclarant une instance (comme ** voiture tempCar; **) peut facilement être sur la pile et n'est pas nécessairement * statique * – NVRAM

+0

Je sais ma phrase n'était pas claire, je voulais dire l'allocation statique en opposition à une allocation dynamique :) merci –

12

Vous devez d'abord déréférencer le pointeur (pour obtenir la structure).

Soit:

(*tempCar).make = "GM"; 

Ou:

tempCar->make = "GM"; 
1

Votre tempCar est un pointeur, vous devez allouer de la mémoire pour lui et assigner comme ceci:

tempCar = new car(); 
tempCar->vin = 1234;   
tempCar->make = "GM"; 
tempCar->year = 1999; 
tempCar->fee = 20.5; 

Sinon, déclare tempCar ainsi: car tempCar;

-2

Les gens, soyez prudent lors de l'utilisation nouvelle, ce n'est pas Java, c'est C++, n'utilisez pas de parenthèses quand vous n'avez pas de paramètres: tempCar = new car;

+2

Pourquoi "faire attention"? C'est un problème de style et je ne suis pas du tout d'accord: utilisez les parens. – NVRAM

+2

Pas un problème de style. Avec les parenthèses, les membres d'un type POD seront construits par défaut.Les parenthèses sont généralement préférées, d'après mon expérience. – GManNickG

-1

Changer votre température voiture * au-dessous de la ligne:

car *tempCar = (car *)malloc(sizeof(car)); 

tempCar->vin = 1234;   
tempCar->make = "GM"; 
tempCar->year = 1999; 
tempCar->fee = 20.5; 
+0

comportement indéfini selon la norme C++. 'new' devrait être utilisé pour l'allocation de mémoire dynamique brute en C++, pas malloc. –

Questions connexes