Dpartement Gnie Civil Dpartement Mcanique nergtique
Les pointeurs et les tableaux
1) Les pointeurs 2) Les tableaux Les chanes de caractres Les tableaux plusieurs indices 3) Les pointeurs sur fonctions
maj de http://iusti.polytech.univ-mrs.fr/~bergougnoux/enseignement.htm
Prog. struct. : C
III-Les pointeurs et les tableaux
Les pointeurs : dfinition
Un pointeur est une variable qui contient l'adresse d'une autre variable : dune donne, dune fonction (fera l'objet du prochain cours).
Prog. struct. : C
III-Les pointeurs ...
Les pointeurs sur donne
Dclaration dun pointeur sur donne Mcanisme de l'adressage indirect Arithmtique des pointeurs
Prog. struct. : C
III-Les pointeurs ...
Dclaration dun pointeur sur donne
La dclaration : Type_donnee *Ident_ptr; Exemple : int *pAdi; // pAdi est cod sur 4 octets (adressage 32 bits) et contiendra l'adresse d'un entier
Prog. struct. : C
III-Les pointeurs ...
Ladressage indirect
Adresse de i contenant
int i,*pAdi; i=10; pAdi = &i; *pAdi = 12;
10 contenu
pAdi
Adresse de i Adresse de pAdi contenu contenant
5
Prog. struct. : C
III-Les pointeurs ...
Ladressage indirect
12 contenu Adresse de i contenant
int i,*pAdi; i=10; pAdi = &i; *pAdi = 12;
pAdi
Adresse de i Adresse de pAdi contenu contenant
6
Prog. struct. : C
III-Les pointeurs ...
& et *
int i; int *padi;
& pour accder l'adresse d'une donne
ex : &i le numro de la case mmoire correspondant la variable i padi = &i; * pour accder au contenu d'une adresse ex : *padi permet d'accder au contenu de l'adresse padi contenu de l'adresse de i i
Prog. struct. : C
III-Les pointeurs ...
Arithmtique des pointeurs sur donnes
Additions et soustractions d'entiers sur les adresses contenues dans les pointeurs Elles les dplacent de la quantit, qui a t additionne ou soustraite, multiplie par la taille en octet du type de l'objet point.
Prog. struct. : C
III-Les pointeurs ...
Exemple
double *pAd; int i = 80; double xx=3.1415; pAd = &xx; pAd = pAd+i; /*pAd +i*sizeof(double) pAd + 80*8 octets*/
Prog. struct. : C
III-Les pointeurs ...
60 64
i = 80 xx = 3.1415
100 pAd = ? 60 64 i = 80 xx = 3.1415
100 pAd = 64 60 64 i = 80 xx = 3.1415
100 pAd = 704
9
Les Tableaux
1. Les tableaux mono-dimensionnels 2. Les chanes de caractres 3. Les tableaux de tableaux
Prog. struct. : C
III- ... Les tableaux
10
Les Tableaux : dclaration et dfinition
Type_donnee Ident_Tab [NbElem]; int, double, char NbElem : le nombre dlments du tableau Cest une constante littrale ou symbolique (#define) Ident_Tab : le nom du tableau, c'est le pointeur sur le tableau, c'est la variable qui contient l'adresse du 1er lment du tableau
Prog. struct. : C
III- ... Les tableaux
11
Exemples
double Toto [100];
//Toto est un tableau de 100 doubles
int MyTab [5] = {1,4,8,7,6};
//MyTab est un tableau de 5 entiers initialis : //MyTab [0]= 1, , MyTab [4]= 6
#define NBELEM 512 float SonTab [NBELEM];
//SonTab est un tableau de NBELEM float
Prog. struct. : C
III- ... Les tableaux
12
Tableaux un seul indice et Pointeur
Type_donnee Tab[N];
Tab[0] Tab[1] Tab[2] Tab[N-1]
Tab+i
pointeur
*(Tab+i)
&Tab[i] Tab [i]
tableau
printf("%d",*MyTab); ou printf("%d",MyTab[0]); scanf("%d",MyTab+2); ou scanf("%d",&MyTab[2]);
Prog. struct. : C
III- ... Les tableaux
13
Chanes de caractres : Tableau 1D de caractres
Dclaration et initialisation : char chaine[10]; char source[]="Ma premiere chaine de char"; Format : printf("\nLe contenu de source est %s",source); scanf("%s",chaine); ou gets(chaine);
char lettre[]={'t','a','r','a','t','a','t','a',0};
Prog. struct. : C
III- ... Les tableaux
14
Chanes de caractres
char *pfin; char cBonjour [] = "Bonjour"; pfin = cBonjour+strlen(cBonjour); do { printf ("%c",*--pfin); }while (pfin != cBonjour);
Prog. struct. : C
III- ... Les tableaux
15
Pour comprendre
'B' 'o' 'n' 'j' 'o' 'u' 'r' 0
cBonjour strlen(cBonjour) renvoie 7 Adresse pointe par
pfin
Adresse pointe par
pfin = cBonjour + 7
Prog. struct. : C
III- ... Les tableaux
16
Chane de Caractres Exemple
!OG
Prog. struct. : C
III- ... Les tableaux
17
Tableau de Tableaux
Dclaration : Type_donne Indent_Tab_Tab[Nlign][Ncol]; Nlign et Ncol sont des constantes entires littrales ou symbolique. Exemple : float mat[3][3]; int trice[3][3]={{1,1,1}, {1,1,1}, {1,1,1}};
printf("%d %d %d", trice[0][0],trice[1][1],trice[2][2]); scanf("%f",&mat[0][0]); ou scanf("%f",mat[0]);
Prog. Struct. - C
III - ... Les tableaux
18
Tableau deux indices
Ligne0 Ligne1 ...
NCol
NCol
NCol
NLign x NCol
Prog. Struct. - C
III - ... Les tableaux
19
Tableau 2 indices et Pointeurs
Tab[i] &Tab[i][0] Tab[i] est un pointeur constant sur un tableau de nCol lments Tab est un pointeur constant sur un tableau dadresses de tableaux de nCol lments Tab[i][j] *(*(Tab+i)+j) int **pptab; //pptab => pointeur de pointeur int tableau[4][4]; // contiendra l'adresse d'une pptab = tableau; // adresse d'entier
Prog. Struct. - C
III - ... Les tableaux
20