[c++] petite question sur les pointeurs (pas un problème)

petite question sur les pointeurs (pas un problème) [c++] - Programmation

Marsh Posté le 31-12-2001 à 21:32:50    

Vite un visuel:
 
void CreateCaca(untype *ent);
//---------------------------
 
void main()
{
    untype *caca;
 
    CreateCaca(caca);
}
 
pourquoi pas:
void main()
{
    untype caca;
 
    CreateCaca(&caca);
}
 
?? ya une différence?

Reply

Marsh Posté le 31-12-2001 à 21:32:50   

Reply

Marsh Posté le 31-12-2001 à 22:29:57    

Ventilo a écrit a écrit :

Vite un visuel:
 
void CreateCaca(untype *ent);
//---------------------------
 
void main()
{
    untype *caca;
 
    CreateCaca(caca);
}
 
pourquoi pas:
void main()
{
    untype caca;
 
    CreateCaca(&caca);
}
 
?? ya une différence?  




 
oui :  
la deuxieme solution est un passage par référence : il se peut qu'à la sortie de la fonction CreateCaca() la variable caca soit modifiée (ca dépend de ce que tu fais dans cette fonction) alors que ce n'est pas le cas dans la première solution

Reply

Marsh Posté le 01-01-2002 à 00:43:55    

c pas ça du tout.
 
Ta fonction attend un pointeur vers une variable de type untype, c'est à dire une variable qui contient l'adresse d'une autre variable qui est du type untype.
 
untype *caca va déclarer un pointeur, c'est à dire une variable qui poura recevoir l'adresse d'une variable de type untype, donc quand tu passe caca à ta fonction ça marche par ce qu'elle reçoit bien l'adresse d'une variable comme argument.
 
maintenent : untype caca déclare une varible de type untype, si tu passe &caca à ta fonction tu lui passe directement l'adresse de la variable caca sans utiliser de variavle intermédiaire.
 
le résultat est donc le même, attention toutefois quand tu tape untype *caca caca ne pointe sur rien en particulier, il est donc prudent d'initialiser systèmatiquement tout les pointeurs.

 

[edtdd]--Message édité par letoII--[/edtdd]

Reply

Marsh Posté le 01-01-2002 à 02:10:58    

Donc si je comprend bien tout cela dépend des goûts du programeur?
 
Le seul endroit où il faut absolument utiliser un pointeur c'est lors du polymorphisme?  
ClassDeBase *moi = new ClasseDérivé()?

Reply

Marsh Posté le 01-01-2002 à 15:03:58    

letoII a écrit a écrit :

c pas ça du tout.
 
Ta fonction attend un pointeur vers une variable de type untype, c'est à dire une variable qui contient l'adresse d'une autre variable qui est du type untype.
 
untype *caca va déclarer un pointeur, c'est à dire une variable qui poura recevoir l'adresse d'une variable de type untype, donc quand tu passe caca à ta fonction ça marche par ce qu'elle reçoit bien l'adresse d'une variable comme argument.
 
maintenent : untype caca déclare une varible de type untype, si tu passe &caca à ta fonction tu lui passe directement l'adresse de la variable caca sans utiliser de variavle intermédiaire.
 
le résultat est donc le même, attention toutefois quand tu tape untype *caca caca ne pointe sur rien en particulier, il est donc prudent d'initialiser systèmatiquement tout les pointeurs.  
 
 




 
parfaitement exact : je me suis trompé et je n'ai aucune excuse, j'ai pas lu assez attentivement.

Reply

Marsh Posté le 01-01-2002 à 15:23:59    

De toute façon le premier ne marchera pas.
untype *caca; n'initialise pas le pointeur. L'adresse sur lequel il pointe est indéterminée.
 
Ensuite CreateCaca(caca) appelle la fonction CreateCaca avec une copie du pointeur caca: c'est à dire que ent est un pointeur qui pointe sur l'adresse de caca (indéterminée). Mais CreateCaca ne peut initialiser le pointeur caca.
 
Pour le faire il faut écrire:

Code :
  1. void CreateCaca(untype **ent);
  2. void main()
  3. {
  4.    untype *caca;
  5.    CreateCaca(&caca);
  6. }


 
Où CreateCaca fait un truc du genre:
*ent = (untype*)malloc(sizeof(untype));

Reply

Marsh Posté le 01-01-2002 à 20:34:57    

Ventilo a écrit a écrit :

Donc si je comprend bien tout cela dépend des goûts du programeur?
 
Le seul endroit où il faut absolument utiliser un pointeur c'est lors du polymorphisme?  
ClassDeBase *moi = new ClasseDérivé()?  




 
Non, les pointeurs peuvent servir à plein de choses autres que l'allocations dynamique: parcour d'un tableau, création de listes chaînées, arbres....

Reply

Marsh Posté le 01-01-2002 à 20:36:11    

Verdoux a écrit a écrit :

De toute façon le premier ne marchera pas.
untype *caca; n'initialise pas le pointeur. L'adresse sur lequel il pointe est indéterminée.
 
Ensuite CreateCaca(caca) appelle la fonction CreateCaca avec une copie du pointeur caca: c'est à dire que ent est un pointeur qui pointe sur l'adresse de caca (indéterminée). Mais CreateCaca ne peut initialiser le pointeur caca.
 
Pour le faire il faut écrire:

Code :
  1. void CreateCaca(untype **ent);
  2. void main()
  3. {
  4.    untype *caca;
  5.    CreateCaca(&caca);
  6. }


 
Où CreateCaca fait un truc du genre:
*ent = (untype*)malloc(sizeof(untype));  




 
c vrai, mais bon sous réserves que le pointeur pointe effectivement sur qqc ça marche

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed