Professional Documents
Culture Documents
Quest-ce quun pointeur ? Un pointeur est une variable qui contient une adresse mmoire. Un pointeur est une variable spciale qui peut contenir l'adresse d'une autre variable. Mmoire La mmoire est divise en emplacements numrots squentiellement. Chaque variable rside dans un emplacement unique en mmoire, connu par son adresse. Nous avons dj utilis loprateur & pour dsigner ladresse.
1
Dune manire gnrale, le langage C permet de manipuler des adresses par lintermdiaire de variables nommes pointeur . On dfinit une variable pointeur selon la syntaxe suivante: Type * nom_pointeur ; Une telle dfinition, dans sa structure correspond la dfinition dune variable. Elle contient le nom de la variable dfinir, qui est dans linstruction prcdente: nom_pointeur Ainsi que le type de cette variable pointeur, reprsenter par la spcification : Type.
2
Interprtation
Lindication de type comporte un nouveau lment, loprateur * que vous connaissez dj en tant quoprateur de multiplication. Cependant dans la dfinition dune variable pointeur, cet oprateur a une signification diffrente est un pointeur vers . Remarque : Les pointeurs et les noms de variables ont le mme rle: Ils donnent accs un emplacement dans la mmoire interne de l'ordinateur. Un pointeur est une variable qui peut 'pointer' sur diffrentes adresses. Le nom d'une variable reste toujours li la mme adresse.
3 4
int *P ;
peut donc interprte comme: la variable P est un pointeur vers une donne de type int Ce qui quivaut : la variable dfinie P a le type int * Autre priphrase quivalente : la variable dfinie P peut mmoriser ladresse dune donne de type int . int A=10 ; P=&A ; /* P pointe sur A */
Interprtation
Pour accder aux donnes stockes ladresse dun pointeur, on utilise loprateur dindirection *. Il faut toujours initialiser lensemble des pointeurs dun programme avec une adresse existante ou la valeur nulle (0). float *a = 0; // 0 cest adresse
Exemple 1
Exemple 2
A B 4 C -2 -P1 0 P2 *P1 *P2 err err
Linstruction int * ad; rserve une variable nomme ad comme tant un pointeur vers des entiers. Loprateur * dsigne le contenu de ladresse ad. Lobjet dadresse ad est de type int; ce qui signifie bien que ad est ladresse dun entier. Linstruction ad=&n; affecte la variable ad la valeur et ladresse de la variable n. Linstruction *ad=m; affecte la valeur de m ad sans changer son adresse : implique n la valeur de m
Init. P1=&A P2=&C *P1=(*P2)++ P1=P2 P2=&B *P1-=*P2 ++*P2 *P1*=*P2 A=++*P2**P1 P1=&C *P2=*P1/=*P2
-2
&A
Exemple 2 (programme)
Exemple 2 (excution)
10
Exemple 3
Supposons que nous avons effectu ces dclarations : int * ad1, * ad2, * ad ; int n=10, p=20 ; Les variables ad1, ad2 et ad sont donc des pointeurs sur des entiers. Remarquez bien la forme de la dclaration, en particulier, si lon avait crit : int * ad1, ad2, ad ; La variable ad1 aurait bien t un pointeur sur un entier (puisque *ad1 est entier) mais ad2 et ad aurait t, quant eux des entiers.
11
Considrons maintenant ces instructions : ad1=&n; ad2=&p; *ad1 = * ad2 + 2; Les deux premires instructions placent dans ad1 et ad2 les adresses de n et p respectivement. La troisime instruction affecte * ad1 la valeur de lexpression * ad2 + 2.
12
13
14
Exemple 1
Notez bien quil ne faut pas confondre un pointeur avec un nombre entier. En effet, lexpression ci-dessus ne reprsente pas ladresse de ad augmente de un (octet). Plus prcisment, la diffrence entre ad+1 est ad est ici de sizeof(int) octets. Loprateur sizeof fournit la taille en octets dun type donn. Si ad avait t dclar comme double: double * ad; Cette diffrence serait de sizeof(double) octets.
17
18
Exemple 2
19
20
Exemple 1
Exemple 2
23
24
Exemple 3
Sans utiliser les oprateurs [ ], crire un programme qui lit et qui calcule le produit scalaire de deux vecteurs. Affichez les rsultats.
25 26
Sources d'erreurs
Un grand nombre d'erreurs lors de l'utilisation de C provient de la confusion entre soit contenu et adresse, soit pointeur et variable. Rsumons :
int A; //dclare une variable simple du type int A dsigne le contenu de A
&A dsigne l'adresse de A int B[10]; dclare un tableau de 10 lments de type int B &B[0] dsigne l'adresse de la premire composante de B. (Cette adresse est toujours constante) *(B+i) B[i] dsigne le contenu de la composante i du tableau B+i &B[i] dsigne l'adresse de la composante i du tableau
27
28
Tableau de chanes
A est un tableau qui a exactement la grandeur pour contenir la chane de caractres et la terminaison '\0'. Les caractres de la chane peuvent tre changs, mais le nom A va toujours pointer sur la mme adresse en mmoire. B est un pointeur qui est initialis de faon ce qu'il pointe sur une chane de caractres constante stocke quelque part en mmoire. Le pointeur peut tre modifi et pointer sur autre chose. La chane constante peut tre lue, copie ou affiche, mais pas modifie.
29 30
Solution 2:
int I,J, SOM; SOM = 0; for (I=0; I<4; I++) for (J=0; J<10; J++) SOM += *(*M+I)+J);
Attention !
Matrices et pointeur
Matrices et pointeur
33
34
Rsum
L'oprateur & permet de rcuprer l'adresse d'une valeur : si on a int a, alors &a dsigne l'adresse de la variable a. L'oprateur * permet de rcuprer la valeur pointe par une adresse si on a int *p, alors p est l'adresse de la variable et *p est sa valeur A un tableau d'un type quelconque i un indice pour les composantes de A A dsigne l'adresse de &A[0] ; A+i dsigne l'adresse de &A[i] *(A+i) dsigne le contenu de A[i] A+i dsigne l'adresse de la composante i du tableau *(A+i) dsigne le contenu de la composante i du tableau Si P = A, alors P pointe sur l'lment A[0] P+i *(P+i) pointe sur l'lment &A[i] dsigne le contenu de A[i]
35
Trouvez les erreurs dans les suites dinstruction suivantes : a) int *p , x = 34; *p = x; *p = x est incorrect parce que le pointeur p nest pas initialis b) int x = 17 , *p = x; *p = 17; *p = x est incorrect. Pour que p pointe sur x il faut faire : p = &x c) double *q; int x = 17 , *p = &x; q = p; q = p incorrect. q et p deux pointeurs sur des types diffrent d) int x, *p; &x = p; &x = p incorrect. &x nest pas une variable (lvalue) et par consquent ne peut pas figurer gauche dune affectation.
36
Comparaison
Faire un programme qui: 1- Dclare un tableau de cette manire: float T[5]={1,2,5,-2,5} ; 2- Dclare deux pointeurs P1 et P2 tels que pointe P1 sur le deuxime lment de T et P2 pointe sur le quatrime. 3- comparez P1 et P2. Afficherez leurs adresses dans un ordre dcroissant. 4- Affichez le tableau T (utilisez la notion pointeur).
37
38