Les pointeurs : aie aie !

coyotte49 Messages postés 12 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 21 juillet 2015 - 17 janv. 2006 à 18:46
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013 - 18 janv. 2006 à 10:13
Salut !
Je fais un p'tit topic sur les pointeurs, parce que la confusion règne ! J'ai compris la base de chez base pour les pointeurs, mais dans certains cas, je pige plus rien... Bon, par exemple, ca :


int *p = a;



Ca va faire quoi ? Erreur ? Contenir adresse de a ? Contenir valeur de a ?
et ça :


int *p =&a;
p++
cout <<*p <<endl; // ???? Affiche 2293680
cout << p <<endl ;



Quand j'incrémente un pointeur, qu'est-ce-qui s'incrément ? La valeur sur le quoi il pointe, ou l'adresse ? Est-ce-que le fragment de code que j'ai mis plus haut est egale à ca :



int *p =&a;
*p++ // ici le changement, j'ai rajouté l'étoile
cout <<*p <<endl; // ???? Affiche 2293680
cout << p <<endl ;



(J'ai rajouté l'étoile). Alors, ca va changé qq chose ?

Si vous pouviez répondre correctement à toutes mes questions, ca m'éclerait. Parce que j'ai une "étude" des fragmentés sur les pointeurs, je sais plus quoi pensé ! Je reviendrai surement apporter de nouvelles questions et fragments de codes... J'espère que vous apporterez vos réponses !

PS : En faite, c'est utile que j'apprenne les pointeurs au moins (en c++). Parce que, j'ai pas trop l'impresion que ca me sert pour le moment !

Merci d'avance ! (Et si vous conaissez une bon p'tit lien pour me remettre les idées en place, pas de refus non plus)

5 réponses

ketchupy45 Messages postés 101 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 13 décembre 2007 1
17 janv. 2006 à 19:45
Salut
int *p = a; // tout dépend de ce qu'est a. Si a est un int* pas de problème si a est un int je doute que ça marche.

par contre int *p=&a marchera si a est un int car tu passe dans ce cas l'adresse mémoire de a.
En fait p pointera vers la meme case que a. Donc si tu delete a il risque d'y avoir des problèmes p sera vide. Car en fait quand tu accedera à p su accedera à la case pointé par p et tu regardera le contenu de cette case.

pour p++ je sais pas désolé, mais je pense que ça risque de bugguer.

quand tu rajoutte l'etoile *p++ tu increment le contenu de la case pointée par p.

Les pointeurs sont utiles car tu peuxfaire des tableaux, alloués et supprimer quand tu le décides. Je te conseille de les apprendre. Par contre c'est source d'erreurs d'allocation ou de suppression...

donc en résumé.
En statique
int a = 3; // tu affecte 3 dans la case
cout<<a; // tu affiche la valeur
cout<<&a; //tu affiche l'adresse de a (en héxadécimal)

en dynamique (pointeurs)
int *a; //a est alors à NULL.
a = new int[];
*a=3;
cout<<*a;//affichera 3
cout<<a, // affichera l'adresse
delete a; //vide a.

pour un tableau
int *a;
a = new int [3]; //tableau de 3 cases
a[0]=2; // tu met la valeur 2 dans la case 1 du tableau , début a 0 !!!!!!!
...
au passage un tableau à l'adresse de sa premiere case
pour le supprimer delete [] a;

voila j'espère que tu me comprends
si t'as d'autres questions n'hesite pas
0
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
17 janv. 2006 à 19:48
Bon pour commencer...

int *p = a;

ça dépend de la déclaration de a si c'est un pointeur ok sinon probleme...

Ensuite p++ va incrémenter l'adresse mais pas de n'importe quel maniere ! De maniere a ce que p pointe sur le prochain élement. autrement dit si il sera incrémenter de sizeof(int) dans ce cas-ci. Et c'est bien entendu différent de *p++.

Et puis les pointeurs c'est très utile et pas juste en C++. Tient betement pour transmettre un tableau a une fonction par exemple. Dans la fonction c'est beaucoup plus simple de jouer avec le tableau via des pointeurs. Dans certain cas c'est même indispensable. Et puis c'est pas que c'est fort compliquer.

XbY
http://sourceforge.net/projects/printtemplate/
0
Alucards Messages postés 40 Date d'inscription mercredi 26 mars 2003 Statut Membre Dernière intervention 3 septembre 2008
17 janv. 2006 à 22:27
moi je te conseil ce cours de c++ qui je pense repondra a tes questions

c'est une version au format html qui est plus simple pour la navigation



http://casteyde.christian.free.fr/cpp/cours/cours_cpp-1.40.6-html.zip



alors les pointeurs sont tres utile ca evite de devoir passer des variables en parametre

je m'explique par exemple un fonction toute bete

prototype

int mafonction( int a,int b)

{


return (a + b);


}



mafonction( 5, 6); va renvoyer 11


dans ce cas quand tu fais appelle a ta fonction elle creer 2
int a et b et les met en memoire jusqu a la fin de l'execution de
ta fonction pour etre detruit



maintenant avec des pointeurs



int mafonction( int* a,int* b)


{


return (*a + *b);


}



int c=7,d=8;

mafonction(&c,&d) va renvoyer 15



dans cette fonction les parametre sont des pointeurs donc quand tu fais
appelle a ta fonction tu passe une adresse et non une variable donc la
fonction ne recreer pas de variable tu ne satureras pas la memoire.



en gros ca marche comme ca mais desfois tu n'as pas le choix d'utiliser les pointeurs

par exemple quand tu creer une classe en c++ où un attribut est un objet ;



par exemple une class A qui contient une class B

si le contructeur de la classe B a des parametres alors dans ta classe
A ton attribut sera forcement un pointeur vers la classe B car en c++
tu ne peux pas initialiser de variable dans ton fichier.h

class B

{

char* nom;// et oui les chaines de caractere sont des pointeurs

B(char* name);// contructeur de la class B

};

class A


{


B *mon_nom;// ici tu ne peux pas faire B mon_nom("alucard") car tu ne peux pas initialiser d'objet dans un .h


};



bref lit le cours de c++ que j'ai mis en lien ca te servira

@++
Tous les chemins mènent au RHUM !!!!!!!!!!!!!!!!!!!..............................
0
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
17 janv. 2006 à 22:55
Aie aie aie...

"dans cette fonction les parametre sont des pointeurs donc quand tu fais
appelle a ta fonction tu passe une adresse et non une variable donc la
fonction ne recreer pas de variable tu ne satureras pas la memoire."

Non !!! D'abord que ce soit dans un cas ou dans l'autre la fonction ne crée pas de variable. Les paramètre sont mis sur la pile et avant l'appel de fonction et celle-ci les exploites. Et pour aller encore plus loin si tu met les pointeurs en paramètre la fonction va devoir les déreference (c a d aller chercher la valeur de la variable a l'adresse indiqué par le pointeur) ce qui fait 2 accès mémoire en plus. Donc au final tu as une fonction plus lente.

De plus c'est une possibilité de bug en plus... En effet la fonction peut modifier la valeur de la variable ce qui peut-être indésirable. (c'est un peu contraire au principe de la POO)

Si tu veux réellement un code plus rapide tu as 2 possibilité :
- Tu met ta fonction inline (c'est tres utiles pour de petites fonction mais plus la fonction grossi plus le gain est négligeable et plus l'executable final sera gros)
- Tu met tes parametres dans des registres (Convient très bien pour des fonctions qui n'ont pas beaucoup de variable interne)

XbYhttp://sourceforge.net/projects/printtemplate/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
18 janv. 2006 à 10:13
Pour éviter les longs discours, je te renvoie a cette adresse ou il y a un cours simple et très complet sur les pointeurs :

http://chgi.developpez.com/pointeur/

Shell
0
Rejoignez-nous