Département Génie Civil Département Mécanique Énergétique
Les pointeurs et les tableaux 1) Les pointeurs 2) Les tableaux • Les chaînes de caractères • 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
1
Les pointeurs : définition Un pointeur est une variable qui contient l'adresse l'adresse d'une autre variable : •
d’une donnée,
•
d’une fonction (fera l'objet du prochain cours).
Prog. struct. : C
III-Les pointeurs ...
2
Les pointeurs sur donnée
• Déclaration d’un pointeur sur donnée • Mécanisme de l'adressage indirect • Arithmétique des pointeurs
Prog. struct. : C
III-Les pointeurs ...
3
Déclaration d’un pointeur sur donnée • La déclaration : 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 ...
4
L’adressage indirect int i,*pAdi;
10
i
Adresse de i
contenu
i=10;
contenant
pAdi = &i; *pAdi = 12; Adresse de i
pAdi contenu Prog. struct. : C
III-Les pointeurs ...
Adresse de pAdi contenant 5
L’adressage indirect int i,*pAdi;
12
i
Adresse de i
contenu
i=10;
contenant
pAdi = &i; *pAdi = 12; Adresse de i
pAdi contenu Prog. struct. : C
III-Les pointeurs ...
Adresse de pAdi contenant 6
& et * int i; int *padi;
& pour accéder à l'adresse d'une donnée ex : &i le numéro de la case mémoire correspondant à la variable i padi = &i; * pour accéder au contenu d'une adresse ex : *padi permet d'accéder au contenu de l'adresse padi contenu de l'adresse de i i Prog. struct. : C
III-Les pointeurs ...
7
Arithmétique des pointeurs sur données • Additions et soustractions d'entiers sur les adresses contenues dans les pointeurs • Elles les déplacent de la quantité, qui a été additionnée ou soustraite, multipliée par la taille en octet du type de l'objet pointé.
Prog. struct. : C
III-Les pointeurs ...
8
Exemple double *pAd; int i = 80;
60
i = 80
64
xx = 3.1415
100
pAd = ?
…
60
i = 80
pAd = &xx;
64
xx = 3.1415
double xx=3.1415;
100
pAd = pAd+i; /*pAd +i*sizeof(double) pAd + 80*8 octets*/
60
i = 80
64
xx = 3.1415
100 Prog. struct. : C
III-Les pointeurs ...
pAd = 64
pAd = 704 9
Les Tableaux
1. Les tableaux mono-dimensionnels 2. Les chaînes de caractères 3. Les tableaux de tableaux…
Prog. struct. : C
III- ... Les tableaux
10
Les Tableaux :
déclaration et définition Type_donnee Ident_Tab [NbElem]; • int, double, char … • NbElem : le nombre d’éléments
du tableau C’est une constante littérale 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 élément 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 //MyTab [0]= 1, … , MyTab [4]= 6
initialisé à :
#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+i
&Tab[i]
*(Tab+i)
Tab [i]
pointeur printf("%d",*MyTab); scanf("%d",MyTab+2); Prog. struct. : C
ou ou
Tab[N-1]
tableau
printf("%d",MyTab[0]); scanf("%d",&MyTab[2]);
III- ... Les tableaux
13
Chaînes de caractères :
Tableau 1D de caractères
• Déclaration et initialisation : char chaine[10]; char source[]="Ma premiere chaine de char"; char lettre[]={'t','a','r','a','t','a','t','a',0};
• Format : printf("\nLe contenu de source est %s",source); scanf("%s",chaine);
Prog. struct. : C
ou gets(chaine);
III- ... Les tableaux
14
Chaînes de caractères 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'
pfin
cBonjour strlen(cBonjour)
Adresse pointée par pfin
Prog. struct. : C
0
renvoie 7
Adresse pointée par = cBonjour
III- ... Les tableaux
+ 7
16
Chaîne de Caractères Exemple !OG
Prog. struct. : C
III- ... Les tableaux
17
Tableau de Tableaux • Déclaration : Type_donne Indent_Tab_Tab[Nlign][Ncol];
et Ncol sont des constantes entières littérales ou symbolique. Nlign
• 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 éléments Tab est un pointeur constant sur un tableau d’adresses de tableaux de nCol éléments 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