et quelques rappels sur certains éléments du langage C Les pointeurs et quelques rappels sur certains éléments du langage C
Définition des pointeurs Initialisation des pointeurs type *identificateur; . . . int *pi; float *pf; double *pd; Type des données int a, *pi; pi = &a; pi = NULL; NULL - dans stdio.h
Pointeurs Adressage direct: Accès au contenu d'une variable par le nom de la variable. Adressage indirect: Accès au contenu d'une variable, en passant par un pointeur qui contient l'adresse de la variable. accès indirect int x,y,*px,*py; x=10; px=&x; py=px; y=*py; //y=x; accès direct x x x x x ? 10 ? 10 ? 10 y y y 10 10 10 10 10 px px py
Pointeurs - arthmetique ptr+const=ptr +const*sizeof(type) ptr-const=ptr - const*sizeof(type) int x, *p; p=&x; p++; p += 4; x=*--p; . . . *p++; *++p; ++*p (*p)++ *(p+1)
Pointeurs - exemples int *pt2; float *pt1; pt1=(float *)pt2; . . . void *pt2; pt1=pt2; int *p, *q; if(p==NULL) . . . if(p<q) . . .
#include <stdio.h> void main() { int i1=1,i2=2; int *p1,*p2; p1=&i1; p2=p1; printf("%d,%d\n",*p1,*p2); /*affiche ?*/ p2=&i2; printf("%d\n",*p2); /*affiche ?*/ *p2=*p1; } 1,1 2 1
#include<stdio.h> int main() { int i; int *j; i = 1; j = &i; *j = 2; printf("i vaut : %d\n", i); return 0; } i vaut : 2
#include <stdio.h> int main() { int i=11; int *ptri; ptri = &i; printf("La valeur %d est pointee par %p\n“,i, ptri); return(0); } La valeur 11 est pointee par 2427:21FE
#include <stdio.h> int main() { int i; int *ptri; ptri = &i; printf("La valeur pointée par ptri est %d\n", *ptri); return(0); } La valeur pointee par ptri est 19125
#include <stdio.h> int main() { int i; int *ptri; ptri = &i; i = 15; printf("La valeur pointée par ptri est %d\n", *ptri); return(0); } La valeur pointee par ptri est 15
Les opérations élémentaires sur pointeurs #include <stdio.h> main() { int A = 1; int B = 2; int C = 3; int *P1, *P2; P1=&A; P2=&C; *P1=(*P2)++; printf("%d,%d\n",*P1,*P2); P1=P2; P2=&B; *P1-=*P2; ++*P2; *P1*=*P2; A=++*P2**P1; P1=&A; *P2=*P1/=*P2; return 0; } 3,4 2,2 6,6 17
Utilisation des pointeurs Fonctions à plusieurs arguments de sortie Calcul d’adresse Allocation dynamique de la mémoire 20
Exemple: Faire un programme C à calculer les trois résultats: 1) le nombre d’ éléments positives; 2) le nombre d’ éléments négatives; 3) la somme de tout les nombres dans un tableau donné.
Exemple: Le prototype de la fonction #include <stdio.h> 1/2 void fon(int a[ ],int n,int *n_pos,int *n_neg,int *s); void main() { int tab[ ]={22,-33,4,5,-6}; int n_pos,n_neg,somme; fon(tab,sizeof(tab)/sizeof(int),&n_pos,&n_neg,&somme); printf("Le nombre d'elements positives=%d\n",n_pos); printf("Le nombre d'elements negatives=%d\n",n_neg); printf("La somme d'elements=%d\n",somme); } Le nombre d'elements positives=3 Le nombre d'elements negatives=2 La somme d'elements=-8
void fon(int a[],int n,int *n_pos,int *n_neg,int *s) 2/2 { int i; *n_pos=*n_neg=*s=0; for(i=0;i<n;i++) { if(a[i]>0) (*n_pos)++; else if(a[i]<0) (*n_neg)++; (*s)+=a[i]; } La définition de la fonction
Utilisation des pointeurs Calcul d’adresse - Exemple: Soit P un pointeur qui 'pointe' sur un tableau A: int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90}; int *P; P = A; Quelles valeurs ou adresses fournissent ces expressions: a) *P+2 => la valeur 14 b) *(P+2) => la valeur 34 c) &P+1 => l'adresse du pointeur derrière le pointeur P(rarement utilisée) d) &A[4]-3 => l'adresse de la composante A[1] e) A+3 => l'adresse de la composante A[3] f) &A[7]-P => la valeur (indice) 7 g) P+(*P-10)=> l'adresse de la composante A[2] h) *(P+*(P+8)-A[7]) => la valeur 23 24
chaîne est une valeur variable
#include <stdio.h> void main() {char *tab[]={"Eleve","Prof","Stage"}; printf("%s,%s\n",tab[0],*tab); printf("%s,%s\n",tab[1],*(tab+1)); printf("%c,%c\n",**tab,*tab[0]); printf("%c,%c\n",*tab[1],*(tab[1]+1)); printf("%c",*(tab[2]+1)); } Eleve,Eleve Prof,Prof E,E P,r t
Exemple: Faire un programme C à trouver: 1) le nombre d’occurrence d’un caractère donné dans une chaîne de caractère donné; 2) la chaîne miroir de la chaîne donné. #include <stdio.h> 1/3 #include <string.h> int count(char *s,char ch); void miroir(char *s,char *t); Les prototypes des fonctions
Entrer des données Appel des fonctions void main() 2/3 { char s[60],m[60],c; printf("Entrer une chaine:"); gets(s); //fgets(s,60,stdin); printf("Entrer un caractere:"); fflush(stdin); c=getchar(); printf("Le nombre de caractere %c dans %s est=%d\n",c,s,count(s,c)); miroir(s,m); printf("La chaine miroir est: %s\n",m); } Entrer des données Appel des fonctions Entrer une chaine:abcdcc Entrer un caractere:c Le nombre de caractere c dans abcdcc est=3 La chaine miroire est: ccdcba
La définition de la fonction de comptage int count(char *s,char ch) 3/3 { int c=0; while(*s!='\0') if(*s++ ==ch)c++; return c; } void miroir(char *s,char *t) { int l=strlen(s); s+=l-1; while(l) {*t++=*s--; l- -; *t='\0'; La définition de la fonction de comptage La définition de la fonction de miroir
Utilisation des pointeurs Allocation dynamique de la mémoire int *a; a … 1 élément 2 éléments n éléments