[C++] Question sur les pointeurs, aidez moi à comprendre svp !

Question sur les pointeurs, aidez moi à comprendre svp ! [C++] - C++ - Programmation

Marsh Posté le 13-10-2002 à 13:13:43    

Voila je suis en spé, et on vient de faire style 1H de cours en info sur les pointeurs et j'ai pas vraiment compris. Genre déjà qu'est-ce qu'un pointeur, que signifie Pt=&A; ou encore *Nom Pointeur; *Pt etc...
Bref, si qq'1 pouvait me faire un pti résumé de ce qu'il savoir et surtout comprendre ca serait sympa. Mecri.  :)


---------------
Be myself, I have nothing to prove...
Reply

Marsh Posté le 13-10-2002 à 13:13:43   

Reply

Marsh Posté le 13-10-2002 à 13:39:48    

Bein en gros quand tu déclares une variable destinée a recevoir un pointeur d'une variable entière tu fais:
 
int brol* ;  (brol est le réceptacle)
 
disons que tu as une variable entière int x, pour mettre l'adresse de la variable dans le receptacle(pointeur) brol, tu fais:
 
brol = &x;
 
en gros "*" pour dire que c'est un pointeur
"&" pour dire que c'est l'adresse de la variable qu'on veut et pas sa valeur  :)
 
@+


Message édité par yaisseloulou le 13-10-2002 à 13:48:30
Reply

Marsh Posté le 13-10-2002 à 13:41:17    

si tu as:  
 
int *a;
et
int b;  
 
et que tu fais a = b; ça ne marchera pas !!
 
idem si tu fais ça
 
int *a;  
 
bool p;  
 
a = &p; selon le compilo ça n'ira pas non plus il faut que le pointeur soit du même type que la varibable ...

Reply

Marsh Posté le 13-10-2002 à 15:53:09    

t'es en spé et tu captes pas les pointeurs ?  :ouch:

Reply

Marsh Posté le 13-10-2002 à 16:01:04    

la mémoire c'est un livre
 
uen adresse c'est le numéro de la page ou se trouve l'information qui t'intéresse
 
 
un pointeur est une variable qui contient l'adresse


Message édité par farib le 13-10-2002 à 16:02:35
Reply

Marsh Posté le 14-10-2002 à 01:33:23    

Harkonnen a écrit a écrit :

t'es en spé et tu captes pas les pointeurs ?  :ouch:  




 
ben moi j'ai appris le C deux ans apres la Spe
alors y'a pas de honte, hein !
 
LeGreg

Reply

Marsh Posté le 14-10-2002 à 02:04:13    

En gros un pointeur c'est une adresse memoire (dans la plupart des langages qui utilisent des pointeurs). Ca pourrait etre autre chose, conceptuellement. C'est juste que pour simplifier le travail, en C, pointeur = adresse memoire.
 
Un pointeur est type (meme s'il a le type void, c'est type)
c'est a dire que autant que possible on ne melange pas les pointeurs de types incompatibles. (en C on peut mais c'est deconseille).  
 
C'est a dire que tu as plusieurs types de pointeurs, un qui pointe vers une variable de type int, l'autre qui pointe vers une struct, ou encore un qui pointe vers une variable de type pointeur vers int (ahah ca se complique) etc..
 
En C on peut les melanger parce que les pointeurs sont des adresses memoires et donc peuvent tous etre ramenes a un type (void*) mais il faut etre conscient qu'on s'expose a des problemes si l'on manipule une banane comme on manipulerait un camion.
 
Tu as des operateurs definis sur les types, le premier c'est l'operateur d'adresse &. Quand tu as defini une variable, elle est TOUJOURS presente a un endroit precis en memoire. C'est pour ca que tu peux demander son adresse par l'operateur &. Une fois que tu as l'adresse de la variable tu peux mettre sa valeur dans un pointeur vers le type de la variable. Tu as une variable de type int, tu as un pointeur vers int, tu peux demander l'adresse de la premiere et la placer dans la seconde:
int toto;
int* pToto = &toto;
comme pToto est une variable, elle est presente a un endroit precis en memoire et donc tu peux egalement demander son adresse et la mettre dans une variable de type pointeur vers pointeur d'int:
int **ppToto = &pToto;
 
Le deuxieme operateur c'est l'operateur de deferencement *. Quand tu as une adresse memoire, tu veux savoir ce qu'il y a a cette adresse. c'est la que tu utilises l'operateur *.
Exemple, tu as recupere un pointeur int* pToto, et tu voudrais connaitre ou modifier la valeur de la variable presente a l'adresse pointee par pToto. tu fais donc:
int totobis = *pToto;
C'est donc d'une certaine facon l'operateur inverse de &.
totobis est une nouvelle variable, c'est a dire qu'elle est physiquement presente en memoire mais a une adresse differente de toto. Meme si elle en partage la valeur. (elle partage la valeur de toto, tant qu'on ne modifie pas toto ou totobis).
par contre *pToto vaudra toujours la valeur de toto, jusqu'a ce qu'on change l'adresse pointee par pToto. L'inverse est vrai: si tu modifies la valeur de *pToto, toto changera de la meme maniere.
 
Le pointeur permet donc d'etendre le scope d'une variable.
C'est a dire si toto est defini dans ton main, et que tu souhaites que l'une de tes fonctions puisse modifier la valeur de toto, tu es oblige (en C) de passer un pointeur vers toto a la fonction. Cette fonction qui a un parametre pToto, pourra modifier *pToto, et donc du meme coup modifier la valeur de toto.
 
Le pointeur permet egalement d'allouer des variables de facon dynamique et manuelle. (contrairement a l'allocation dynamique et automatique). (malloc renvoie un pointeur).
 
Le pointeur permet de designer un tableau d'objet. Si tu as un objet de type int a l'adresse pToto, tu as un autre objet de type int a l'adresse pToto+1. Evidemment, il faut prealablement avoir alloue (manuellement ou automatiquement) suffisamment d'espace pour pouvoir librement acceder ou ecrire a l'adresse pToto+1, sinon il y a des chances que quelque chose d'autre qu'un int se trouve en pToto+1..
 
Voila un rapide appercu de ce que sont les pointeurs,
il y a encore beaucoup a en dire (array et pointeur NULL en C, differents types de cast en C++, pointeur ou reference en C++, typesafety constness etc..)
 
LeGreg

Reply

Marsh Posté le 15-10-2002 à 00:36:41    

legreg a écrit a écrit :

Quand tu as defini une variable, elle est TOUJOURS presente a un endroit precis en memoire.


Pas toujours.
On ne peut prendre l'adresse d'une variable spécifiée register, par exemple.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 16-10-2002 à 12:32:45    

Harkonnen a écrit a écrit :

t'es en spé et tu captes pas les pointeurs ?  :ouch:  




 
Tout le monde n'a pas ton intelligence, mon cher Harkonnen, ni tes talents pédagogiques, ni tes incroyables connaissances informatiques.
 
N'oublies pas non plus que la force rend humble.
 
Bien à toi!


Message édité par YungMakko le 16-10-2002 à 12:33:27

---------------
In tartiflette, we trust!
Reply

Marsh Posté le 16-10-2002 à 13:34:17    

Roooo, mais pq à chaque fois que je dis un truc tt le monde le prend mal ? :(
Je trouvais juste ça bizarre, c tout !
Les pointeurs s'apprennent en 1ere année d'IUT info (de mon temps en tout cas :d), et c pour ça que je trouve bizarre que tu n'abordes les pointeurs qu'en spé, surtout si tu as fait de la prog avant. Ca n'avait rien de méchant !
 
:hello:

Reply

Marsh Posté le 16-10-2002 à 13:34:17   

Reply

Marsh Posté le 16-10-2002 à 21:00:33    

Harkonnen a écrit a écrit :

Roooo, mais pq à chaque fois que je dis un truc tt le monde le prend mal ? :(
Je trouvais juste ça bizarre, c tout !
Les pointeurs s'apprennent en 1ere année d'IUT info (de mon temps en tout cas :d), et c pour ça que je trouve bizarre que tu n'abordes les pointeurs qu'en spé, surtout si tu as fait de la prog avant. Ca n'avait rien de méchant !




 
oui il y a des gens qui apprennent ce qu'est un pointeur en CM2
et d'autres qui ne sauront jamais ce que c'est (les fous)
c'est bizarre mais c'est comme ca que la vie est faite.
 
Ceci dit, IUT d'info != math sup/spe
ceci devant expliquer cela :)
 
LeGreg


Message édité par LeGreg le 16-10-2002 à 21:06:25
Reply

Marsh Posté le 16-10-2002 à 21:05:54    

Musaran a écrit a écrit :

Pas toujours.
On ne peut prendre l'adresse d'une variable spécifiée register, par exemple.




 
ahah et que repond l'operateur & sur une variable
specifiee en register ?
 

Citation :

ANSI C does not allow for taking the address of a register object; this restriction does not apply to C++. However, if the address-of operator (&) is used on an object, the compiler must put the object in a location for which an address can be represented. In practice, this means in memory instead of in a register.


 
de plus, l'optimisateur de VC ignore toutes les requetes "register".
 
Mais bon c'est un cas tres particulier du C (C++)
qu'il est bon d'ignorer.
 
LeGreg

Reply

Marsh Posté le 17-10-2002 à 03:50:38    

Merci maître !
 
En est-il de même avec inline ?
Je sais qu'en C++, cela la force à exister en mémoire.
Mais en C99 ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 17-10-2002 à 09:52:25    

"volatile" force une variable en memoire.
 
On fait du C++ en spé maintenant ??? Pour moi c'était du Pascal et du Caml et l'aspect "pédagogique" du C++ m'échape.

Reply

Sujets relatifs:

Leave a Replay

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