[c] les pointeurs

les pointeurs [c] - Programmation

Marsh Posté le 03-07-2002 à 09:08:47    

j'ai lu plein de doc mais je viens d'un language qui ne possède pas de pointeurs.
 
je sais ce qu'est un pointeur, mais je ne vois pas très bien sont utilité
 
je voudrais savoir par exemple : scanf("votre nom",&a)
pourquoi je doit mettre '&a' et pas 'a'
 
de même pourquoi avec la fonction printf je ne doit pas l'utiliser.
 
 
en gros, quel intérets ?
 
je sais pas si je suis claire, mais une étincelle pourrais décalencher un grand feu de joie
 

Reply

Marsh Posté le 03-07-2002 à 09:08:47   

Reply

Marsh Posté le 03-07-2002 à 09:20:02    

Bon je me lance, je vais essayer de t'expliquer (quand on connait mes capacités pédagogiques ça fait peur).
 
Les valeurs de tes variables sont stocké dans la mémoire de la machine. Par exemple lorsque tu déclare un long on te donne un espace méoire de 4octets où tu peux stocker la valeur de la variable.
 
Un pointeur est une variable qui contient l'adresse d'une autre variable, c'est à dire l'endroit de la méoire où se trouve la valeur de ta variable.
 
Prenons un exemple:
 

Code :
  1. #include <stdio.h>
  2. void exempleProc1(int i, int j)
  3. {
  4. i += j;
  5. }
  6. void exempleProc2(int *i, int *j)
  7. {
  8. *i += *j;
  9. }
  10. int main()
  11. {
  12.    int a,b;
  13.    a = 1;
  14.    b = 2;
  15.    exempleProc1(a,b);
  16.    printf("%d,%d",a,b);
  17.    /*affiche 1,2*/
  18.    exempleProc2(&a,&b);
  19.    printf("%d,%d",a,b);
  20.    /*affiche 3,2*/
  21.   return 0;
  22. }


 
Dans le cas de printf on ne fait que lui passer des valeur à afficher donc elle n'as pas besoin d'avoir les adrese des variables contenant ces valeurs.
Pour scanf c'est différent, elle doit modifier tes variables, pour celà tu lui passe leurs adresses pour qu'elle aille modifier les valeurs stockées.


---------------
Le Tyran
Reply

Marsh Posté le 03-07-2002 à 09:21:52    

Bon ben je sais pas si je vais etre clair non plus mais je vais essayer.
 
Les pointeurs sont tres utiles en parametres de fonction.
 
Un exemple assez con :
 
Une fonction qui imprime des infos sur un client sans pointeurs :
 
EcrireInfo(int age, char *nom, char *prenom, char *adresse, ....
 
C'est ingerable.
Donc pour ca tu te fais une structure CLIENT (avec les infos age, nom, prenom, ...) et tu passes la struct en parametre.
 
Ca donne EcrireInfo(CLIENT *client...
 
En fait je sais pas si ca va t'aider :/


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 09:23:26    

lamatrice a écrit a écrit :

 
je voudrais savoir par exemple : scanf("votre nom",&a)
pourquoi je doit mettre '&a' et pas 'a'
 
de même pourquoi avec la fonction printf je ne doit pas l'utiliser.
 
 
en gros, quel intérets ?




 
Les pointeurs servent a une fonction de connaitre l'adresse d'une variable pour pouvoir modifier cette variable.
 
Comme le printf ne modifie aucune des variables que l'on met en parametres, il n'a pas besoin d'utiliser de pointeur.
 
Par contre scanf utilise un pointeur pour pouvoir modifier ta variable 'a'. Le scanf a donc besoin de l'adresse de a, qui est &a!!
 
Il faut toujours un type dans un scanf, et le texte "votre nom" doit etre affiché avec printf, donc:
 

Code :
  1. int a;
  2. printf("un numero" );
  3. scanf("%d",&a);



---------------
www.isamu.fr.st tout sur SuperNova LE shoot them up freeware
Reply

Marsh Posté le 03-07-2002 à 09:27:14    

merci de vos infos mais comme je le disais, je sais ce qu'est le pointeur( adresse mémoire d'une variable).
 
ce que je voudrais savoir c'est sont intéret  
et ça j'ai pas capter dans vos explication

Reply

Marsh Posté le 03-07-2002 à 09:28:05    

ah voilà qui semble plus claire

Reply

Marsh Posté le 03-07-2002 à 09:29:07    

mais pourqoi quand on fait une affectation on utilisa pas le pointeur alors ?
 
 
a=5;
&a=5;

Reply

Marsh Posté le 03-07-2002 à 09:36:26    

Code :
  1. int a


 
Ta variable a désigne un entier. Si tu fais a = 5 ton entier prend la valeur 5. &a désigne l'emplacement mémoir où est stocké l'entier, si tu pouvais faire &a = 5, tu modifierais l'endroit où est tocké la variable a, tu lui dirais de la stocker à l'adresse 5. Mais ça on peut pas le faire :D (pas comme ça en tout cas)


---------------
Le Tyran
Reply

Marsh Posté le 03-07-2002 à 09:39:08    

lamatrice a écrit a écrit :

mais pourqoi quand on fait une affectation on utilisa pas le pointeur alors ?
 
 
a=5;
&a=5;
 




Parce que dans le deuxieme cas tu changerais l'adresse de ta variable...
 
et = n'est pas une fonction, donc il n'y a pas de passage par valeur...
 
La raison d'etre du pointeur en C, c'est que les fonction recoivent leurs parametres par valeurs, passer l'adresse permet de modifier la valeur de celle-ci pour l'appelant
 
Une autre utilitée est l'allocation dynamique.

Reply

Marsh Posté le 03-07-2002 à 10:34:22    

Un autre avantage des pointeurs, est que ça te permet de passer une adresse en paramètre au lieu d'un objet entier.
 
Par exemple, si tu as une fonction qui prend une structure en paramètre, tu as tout intéret à passer l'adresse de ta structure au lieu de la structure en elle même, c'est plus rapide et ça évite de bouffer de l'espace pile


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-07-2002 à 10:34:22   

Reply

Marsh Posté le 03-07-2002 à 10:37:44    

lamatrice a écrit a écrit :

merci de vos infos mais comme je le disais, je sais ce qu'est le pointeur( adresse mémoire d'une variable).
 
ce que je voudrais savoir c'est sont intéret  
et ça j'ai pas capter dans vos explication  




 
Par exemple gerer un tableau de donnees dont tu ne connais pas la taille à l'avance mais seulement lors de l'execution.
 
Aussi pour eviter de passer plusieurs Ko a a chaque appel de fonction puisque tu ne transmets que l'adresse.
 
et apres en combinant pointeur et strcutre tu peux faire des listes, des arbres, ... .


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 10:42:15    

ensuite, je suppose que tu parles probablement du Visual Basic ?
 
si c'est le cas saches que dans le visual basic il y AS des pointeurs.
sauf qu'ils évitent d'en parler tel quel.
 
par exemple:
 
'pointeur: il n'y a pas réellement d'objet crée
Dim Yo As Nodedetruc
'intialisation du pointeur
Set Yo = WindowListMachin.NewItem
 
'là on bien une création d'objet
Dim Yo2 As New NodeTruc
 
le VB est très batard... ( il faut aussi des fois faire un Set Yo = Nothing, pour pouvoir choper un autre objet )
 
 
 

Reply

Marsh Posté le 03-07-2002 à 10:46:26    

ou par exemple, tu prends un jeu de voiture:
 
tu as des objets de modèles 3D (qui servent à tracer la voiture)
 
donc tu auras une structure du style:
 
modèle d'objet 3d
{
  liste de points dans l'espace
  liste de polygone
}
 
et des objets "voitures", qui décrivent une voiture
 
voiture
{
 modèle *model;
 float vitesse,direction,poids....
}
 
toutes les "voitures" utiliseront le même modèle 3D, il faudra donc que toutes les instances de voiture pointe sur le même modèle alloué en mémoire.
 
bon c'est ptet pas super limpide :D


Message édité par bjone le 03-07-2002 à 10:47:08
Reply

Marsh Posté le 03-07-2002 à 10:51:03    

bjone a écrit a écrit :

bon c'est ptet pas super limpide :D


au moins tu t'en es rendu compte :D

Reply

Marsh Posté le 03-07-2002 à 10:58:52    

bin j'ai essayé de lui faire comprendre que tu as plusieurs objets qui référencent un objet partagé par tout le monde, c'est généralement par pointeur....
 
disons que j'arrives à faire comprendre des concepts de programmation à des potes en leur montrant des jeux, et leur expliquant un peu les structures s'imbriquent les unes dans les autres....

Reply

Marsh Posté le 03-07-2002 à 11:01:23    

en gros pour continuer avec mon idée:
 
tu prends need for speed: tu peux croiser plusieurs bagnoles du même modèle dans le jeu...
 
donc quelque part, tu as 1 modèle 3D de la bagnole (qui maintient la géométrie à traçer à l'écran), et 'n' objets qui pointent sur ce modèle, en indiquant des propriétés (position, vitesse, etc, etc...)


Message édité par bjone le 03-07-2002 à 11:01:38
Reply

Marsh Posté le 03-07-2002 à 11:43:03    

dis nous de quel langage tu viens
comme ca on pourra t'expliquer comment
tu utilises les pointeurs sans le savoir :)
 
LeGreg

Reply

Marsh Posté le 03-07-2002 à 11:54:08    

Ce qu'il faut savoir c'est que les pointeurs c'est
vraiment bas niveau (notamment l'arithmétique des pointeurs)
et ca n'a rien d'obligatoire dans un langage.
Reste que le C qui est un langage bas niveau
ne connait que ca (les pointeurs).
Donc je crois que ta question est mal posée:  
ce n'est pas "pourquoi je dois utiliser des pointeurs en C?"
tout simplement parce que c'est la facon dont est construite le langage C mais "comment les utiliser" et ca je pense qu'il y a pas mal d'exemple d'utilisation qui ont été donnés.
 
LeGreg

Reply

Marsh Posté le 03-07-2002 à 13:08:12    

merci pour toutes ces réponses......elles m'éclairent....si si....
 
sinon je fait du java, et du php et j'ai jamais eu besoin d'utiliser les pointeurs (ou alors sans le savoir)

Reply

Marsh Posté le 03-07-2002 à 13:41:39    

lamatrice a écrit a écrit :

merci pour toutes ces réponses......elles m'éclairent....si si....
 
sinon je fait du java, et du php et j'ai jamais eu besoin d'utiliser les pointeurs (ou alors sans le savoir)




 
En Java, y'a pas de pointeurs mais des references, qui sont ausi dispo en C++. Si tu fais du Java, tu devrai t'en sortir facilement en C++, avec en plus les pointeurs.


---------------
www.isamu.fr.st tout sur SuperNova LE shoot them up freeware
Reply

Marsh Posté le 03-07-2002 à 13:57:03    

avec les pointeurs tu peux allouer dynamiquement la mémoire.
par ex tu peux créer un tableau dont tu ne connais pas à l'avance la taille. (ca a deja été dit il me semble..)

Reply

Marsh Posté le 03-07-2002 à 14:30:22    

lamatrice a écrit a écrit :

 
sinon je fait du java, et du php et j'ai jamais eu besoin d'utiliser les pointeurs (ou alors sans le savoir)




 
tous les mecanismes qui te semblent naturel en java utilisent
des pointeurs en sous-main.  
Java => haut niveau, C => bas niveau
notamment en java ils poussent le paradigme objet au plus loin
ce qui leur permet de faire de la prog objet tres efficace mais leur interdit tous les raccourcis faisables en C.
Le pointeur c'est l'objet de base qui dérive de l'assembleur, en haut niveau on leur donne des noms différents: reference, iterateur, tableau statique ou dynamique, chaine, etc..
Toutes les notions de la prog "elevée" sont traduisibles en C ou en assembleur. L'assembleur ne connait que les registres et les pointeurs, les goto etc.. Le C est une sorte d'assembleur évolué avec des types, des fonctions, des boucles, des macros, des mecanismes d'allocation automatiques etc..
 
Pour ce qui est des references en java, elles sont assez differentes des references en C++ (elles ont juste le meme nom).
En java quand tu manipules une reference, tu manipules l'objet lui-meme (pas d'arithmétique des references, pas d'operateur de deferencement), un peu comme une reference en C++.  
Par contre, une reference peut etre nil et peut etre reassignée dans sa durée de vie (elle fait reference a un autre objet). Un peu comme un pointeur en C/C++.
 
LeGreg

Reply

Marsh Posté le 18-07-2002 à 00:23:31    

lamatrice a écrit a écrit :

je voudrais savoir par exemple : scanf("votre nom",&a)
pourquoi je doit mettre '&a' et pas 'a'


En C les arguments sont transmis par valeur. scanf recevrait (inutilement) la valeur de a, alors qu'il veut une adresse pour écrire.
En C++ on pourrait réecrire cette fonction pour recevoir une référence. Alors on mettrait 'a' et elle prendrait tout seule l'adresse de a (sous forme de référence).
 
L'intérêt du pointeur, c'est sa puissance: désigner n'importe quelle variable, existante ou même à venir, où qu'elle soit en mémoire (globale,pile,dynamique).
 
Je connaît ces utilisations des pointeurs/adresses:

Code :
  1. //identité d'objet par son adresse
  2. if(ptr1==ptr2)... //si ptr1 et ptr2 désignent le même objet...
  3. //identité changeante
  4. ptr= test ? &a : &b ;
  5. *ptr=... ; //change a ou b...
  6. //éviter la copie de gros objet
  7. void f(const BigStruct* arg){ //reçoit sizeof(pointeur) octets plutôt que des tonnes...
  8. int tmp= BigStruct->ChampInt ; //...mais travail d'indirection supplémentaire.
  9. }
  10. //valeur de retour complexe de fonction
  11. void analyse(int in , BigStruct* out1 , BigStruct* out2){ //pas de const, la fonction peut modifier l'original
  12. scanf("bla",out1->ChampPtrChar) ; //impossible avec return
  13. }
  14. //parcours rapide de tableau
  15. for(int  i=     0  ; i<     numelem  ; i++) tab[i]=... ; //par indice   (normal)
  16. for(int* p=&tab[0] ; p<&tab[numelem] ; p++)    *p =... ; //par pointeur (plus rapide)
  17. //allocation dynamique
  18. int* ptr= (int*)malloc(num*sizeof(int)) ; //allocation de num int
  19.      ptr= (int*)realloc(ptr,2*num*sizeof(int)) ; //réallocation à 2*num int


 

lamatrice a écrit a écrit :

mais pourqoi quand on fait une affectation on utilisa pas le pointeur alors ?
a=5;
&a=5;


'a' tout seul, c'est juste la variable, sans plus. Après, le contexte décide:

Code :
  1. a=... ; //écrire une valeur dedans.
  2. ...=a ; //lire sa valeur
  3. a++   ; //lire, incrémenter, et écrire

C'est juste les choix de base dans la syntaxe d'un langage...


Message édité par Musaran le 18-07-2002 à 00:25:55

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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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