Vous êtes sur la page 1sur 106

LANGAGE

DE PROGRAMMATION
LE LANGAGE C

3ime par7e

VII- LES TABLEAUX


Dni&ons : tableaux une dimension Un tableau (unidimensionnel) A est une variable structure forme d'un nombre en7er N de variables simples du mme type, qui sont appeles les composantes ou lments du tableau. Le nombre de composantes N est alors la dimension du tableau.
A =
..

VII- LES TABLEAUX


En faisant le rapprochement avec les mathma7ques, on dit encore que "A est un vecteur de dimension N
Exemple 1 int A[20]; int Tab[10]; oat Vect[100]; long double Trace[15];

VII- LES TABLEAUX


Dclara&on Dclara&on de tableaux en langage algorithmique tableau <NomTableau>[<Dim.>] <TypeSimple> Dclara&on de tableaux en C <TypeSimple> <NomTableau>[<Dim.>]; Les noms des tableaux sont des iden&cateurs qui doivent correspondre aux restric7ons standards

VII- LES TABLEAUX


Chaque lment du tableau est iden7able par son indice. Cependant la numrota7on commence par 0 !
Exemple 2 int A[20]; A[0]=1; A[1]=10; A[19]=5; Exemple 3 int A[20]={1,10,..,5}; for(i=0;i<20;i++) A[i]=2*i;

VII- LES TABLEAUX


Ne pas confondre lindice et la valeur de llment. A[i] # i Pour i = 5 par exemple, A[5] = 12

VII- LES TABLEAUX


Ini&alisa&on Lors de la dclara7on d'un tableau, on peut ini7aliser les composantes du tableau, en indiquant la liste des valeurs respec7ves entre accolades. Il faut videmment veiller ce que le nombre de valeurs dans la liste corresponde la dimension du tableau. Si la liste ne con7ent pas assez de valeurs pour toutes les composantes, les composantes restantes sont ini7alises zro.

VII- LES TABLEAUX


Ini&alisa&on Exemples int A[5] = {10, 20, 30, 40, 50}; oat B[4] = {-1.05, 3.33, 87e-5, -12.3E4}; int C[10] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1}; int K[12] = {0}

VII- LES TABLEAUX


Rserva&on et Mmorisa&on En C, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau. Les adresses des autres composantes sont calcules (automa7quement) rela7vement cepe adresse. Exemple: int A[5] = {1200, 2300, 3400, 4500, 5600};

VII- LES TABLEAUX


Rserva&on Si un tableau est form de N composantes et si une composante a besoin de M octets en mmoire, alors le tableau occupera de N*M octets. Exemple En supposant qu'une variable du type long occupe 4 octets (c.--d: sizeof(long)=4), pour le tableau T dclar par: long T[15]; C rservera N*M = 15*4 = 60 octets en mmoire.

VII- LES TABLEAUX


Rserva&on automa&que Si la dimension n'est pas indique explicitement lors de l'ini7alisa7on, alors l'ordinateur rserve automa7quement le nombre d'octets ncessaires.

VII- LES TABLEAUX


Rserva&on automa&que Exemples int A[] = {10, 20, 30, 40, 50}; ==> rserva7on de 5*sizeof(int) octets (dans notre cas: 10 octets) oat B[] = {-1.05, 3.33, 87e-5, -12.3E4}; ==> rserva7on de 4*sizeof(oat) octets (dans notre cas: 16 octets) int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1}; ==> rserva7on de 10*sizeof(int) octets (dans notre cas: 20 octets)

VII- LES TABLEAUX


Accs aux composantes En dclarant un tableau par : int A[5]; nous avons dni un tableau A avec cinq composantes, auxquelles on peut accder par : A[0], A[1], ... , A[4]
Int A[5] = {1200 , 2300 , 3400 , 4500 , 5600}

VII- LES TABLEAUX


Achage et aecta&on La structure for se prte par7culirement bien au travail avec les tableaux. La plupart des applica7ons se laissent implmenter par simple modica7on des exemples-types de l'achage et de l'aecta7on. - Achage du contenu d'un tableau

VII- LES TABLEAUX


Achage et aecta&on Traduisons le programme AFFICHER du langage algorithmique en C : main() programme AFFICHER
en7er tableau A[5] en7er I pour I variant de 1 5 faire crire A[I] npour Finprogramme { int A[5]; int I; for (I=0; I<5; I++) prinw("%d ", A[I]); prinw("\n"); }

VII- LES TABLEAUX


Aecta&on avec des valeurs provenant de l'extrieur : Traduisons le programme REMPLIR du
langage algorithmique en C:


programme REMPLIR en7er tableau A[5] en7er I pour I variant de 1 5 faire lire A[I] npour nprogramme

main() { int A[5]; int I for (I=0; I<5; I++) scanf("%d", &A[I]); }

VII- LES TABLEAUX


Tableau deux dimensions Dni&ons En C, un tableau deux dimensions A est interprter comme un tableau (uni-dimensionnel) de dimension n dont chaque composante est un tableau (uni-dimensionnel) de dimension m . On appelle n le nombre de lignes du tableau et m le nombre de colonnes du tableau. n et m sont alors les deux dimensions du tableau. Un tableau deux dimensions con7ent donc n*m composantes.

VII- LES TABLEAUX


m Colonnes

n Lignes

VII- LES TABLEAUX


Tableau deux dimensions En faisant le rapprochement avec les mathma7ques, on peut dire que "A est un vecteur de n vecteurs de dimension m", ou mieux: A est une matrice de dimensions n et m .

VII- LES TABLEAUX


Exemple Considrons un tableau NOTES une dimension pour mmoriser les notes de 20 lves d'une classe dans un devoir: int NOTE[20] = {45, 34, ... , 50, 48};

VII- LES TABLEAUX


Pour mmoriser les notes des lves dans les 10 devoirs d'un trimestre, nous pouvons rassembler plusieurs de ces tableaux uni- dimensionnels dans un tableau NOTES deux dimensions : int NOTE[10][20] = {{45, 34, ... , 50, 48}, {39, 24, ... , 49, 45}, ... ... ... {40, 40, ... , 54, 44}};

VII- LES TABLEAUX


Dans une ligne nous retrouvons les notes de tous les lves dans un devoir. Dans une colonne, nous retrouvons toutes les notes d'un lve.

VII- LES TABLEAUX


Dclara4ons Dclara7on de tableaux deux dimensions en langage algorithmique :
tableau <NomTabl>[<DimLigne>,<DimCol>]<TypeSimple>

Dclara7on de tableaux deux dimensions en C :


<TypeSimple> <NomTabl>[<DimLigne>][<DimCol>];

VII- LES TABLEAUX


Ini4alisa4on Lors de la dclara7on d'un tableau, on peut ini7aliser les composantes du tableau, en indiquant la liste des valeurs respec7ves entre accolades. A l'intrieur de la liste, les composantes de chaque ligne du tableau sont encore une fois comprises entre accolades. Pour amliorer la lisibilit des programmes, on peut indiquer les composantes dans plusieurs lignes. Exemple : int A[3][10] ={{ 0,10,20,30,40,50,60,70,80,90}, {10,11,12,13,14,15,16,17,18,19}, { 1,12,23,34,45,56,67,78,89,90}};

VII- LES TABLEAUX


Rserva&on automa&que Si le nombre de lignes L n'est pas indiqu explicitement lors de l'ini7alisa7on, l'ordinateur rserve automa7quement le nombre d'octets ncessaires. int A[][10] = { { 0,10,20,30,40,50,60,70,80,90}, {10,11,12,13,14,15,16,17,18,19}, { 1,12,23,34,45,56,67,78,89,90}};

VII- LES TABLEAUX


Accs un tableau deux dimensions en C <NomTableau>[<Ligne>][<Colonne>] Les lments d'un tableau de dimensions L et C se prsentent de la faon suivante: | A[0][0] A[0][1] A[0][2] . . . A[0][C-1] | | A[1][0] A[1][1] A[1][2] . . . A[1][C-1] | | A[2][0] A[2][1] A[2][2] . . . A[2][C-1] | | . . . . . . . . . . . . . . . | | A[L-1][0] A[L-1][1] A[L-1][2] . . . A[L-1][C-1] |

VII- LES TABLEAUX


Accs un tableau deux dimensions en C Apen7on ! Considrons un tableau A de dimensions N et M. En C, - les indices du tableau varient de 0 N-1, respec7vement de 0 M-1. - la composante de la Nime ligne et Mime colonne est note: A[N-1][M-1]

VII- LES TABLEAUX


Achage et aecta&on Lors du travail avec les tableaux deux dimensions, nous u7liserons deux indices (p.ex: I et J), et la structure for, souvent imbrique, pour parcourir les lignes et les colonnes des tableaux. - Achage du contenu d'un tableau deux dimensions Traduisons le programme AFFICHER du langage algorithmique en C :

VII- LES TABLEAUX


programme AFFICHER en7er tableau A[5,10] en7er I,J pour I variant de 1 5 faire pour J variant de 1 10 faire crire A[I,J] npour (j) crire npour (i) nprogramme main() { int A[5][10]; int I,J; /* Pour chaque ligne ... */ for (I=0; I<5; I++) { for (J=0; J<10; J++) prinw("%7d", A[I][J]); /* Retour la ligne */ prinw("\n"); } }

VII- LES TABLEAUX


Exercices : 1- Remplir un tableau en7er A[10] 2- Acher les lments du tableau A du plus pe7t au plus grand (que des valeurs posi7ves, pas de doublon ni de 0) 3- Remplir une matrice de rels M[10][10] 4- Annuler la premire diagonale.

VIII- LES CHANES DE CARACTRE


Dclara&on de chanes de caractres en langage algorithmique chane <NomVariable> Dclara&on de chanes de caractres en C char <NomVariable> [<Longueur>]; Exemples
char NOM [20];char PRENOM [20];char PHRASE [300];

VIII- LES CHANES DE CARACTRE


Espace rserver Lors de la dclara7on, nous devons indiquer l'espace rserver en mmoire pour le stockage de la chane. La reprsenta7on interne d'une chane de caractres est termine par le symbole '\0' (NUL). Ainsi, pour un texte de n caractres, nous devons prvoir n+1 octets.

VIII- LES CHANES DE CARACTRE


Mmorisa&on Le nom d'une chane aussi l'adresse du premier caractre de la chane. Pour mmoriser une variable texte de N caractres, nous avons besoin de N+1 octets en mmoire : Exemple: Mmorisa&on d'un tableau char TXT[10] = "BONJOUR !";

VIII- LES CHANES DE CARACTRE


Constantes et ini&alisa&ons En gnral, les tableaux sont ini7aliss par l'indica7on de la liste des lments du tableau entre accolades : char CHAINE[] = {'H','e','l','l','o','\0'}; Nous pouvons aussi u7liser une ini7alisa7on plus confortable en indiquant simplement une chane de caractre constante : char CHAINE[] = "Hello";

VIII- LES CHANES DE CARACTRE


Accs aux lments dune chane L'accs un lment d'une chane de caractres peut se faire de la mme faon que l'accs un lment d'un tableau. En dclarant une chane par: char A[6]; nous avons dni un tableau A avec six lments, auxquels on peut accder par: A[0], A[1], ... , A[5]

VIII- LES CHANES DE CARACTRE


"ABC" prcde "BCD" "ABC" prcde "B" "Abc" prcde "abc" "ab" prcde "abcd" " ab" prcde "ab" car 'A'<'B' car 'A'<'B' car 'A'<'a' car "" prcde "cd" car ' '<'a'

(le code ASCII de ' ' est 32, et le code ASCII de 'a' est 97)

VIII- LES CHANES DE CARACTRE


Travailler avec les chanes de caractre Les bibliothques de fonc7ons de C con7ennent une srie de fonc7ons spciales pour le traitement de chanes de caractres. Les fonc&ons de <stdio.h> La bibliothque <stdio.h> ore des fonc7ons qui eectuent l'entre et la sor7e des donnes. A ct des fonc7ons prinw et scanf, on trouve les deux fonc7ons puts et gets, spcialement conues pour l'criture et la lecture des chanes de caractres.

VIII- LES CHANES DE CARACTRE


Achage de chanes de caractres prinw avec le spcicateur de format %s permet d'intgrer une chane de caractres dans une phrase. char NOM[] = "hello, world";
printf(":%s:", NOM); printf(":%5s:", NOM); printf(":%15s:", NOM); printf(":%-15s:", NOM); printf(":%.5s:", NOM);

:hello, world: :hello, world: : hello, world: :hello, world : :hello:

VIII- LES CHANES DE CARACTRE


Achage de chanes de caractres puts est idale pour crire une chane constante ou le contenu d'une variable dans une ligne isole. Syntaxe: puts( <Chane> )
Effet: puts crit la chane de caractres dsigne par <Chane> sur stdout et provoque un retour la ligne. En pratique: puts(TXT); est quivalent printf("%s\n",TXT);

VIII- LES CHANES DE CARACTRE


Lecture de chanes de caractres scanf avec le spcicateur %s permet de lire un mot isol l'intrieur d'une suite de donnes du mme ou d'un autre type.
Effet: scanf avec le spcificateur %s lit un mot du fichier d'entre standard stdin et le mmorise l'adresse qui est associe %s.

VIII- LES CHANES DE CARACTRE


Lecture de chanes de caractres gets est idal pour lire une ou plusieurs lignes de texte (p.ex. des phrases) termines par un retour la ligne.
Syntaxe : gets( <Chane> ) Effet : gets lit une ligne de caractres de stdin et la copie l'adresse indique par <Chane>. Le retour la ligne final est remplac par le symbole de fin de chane '\0'.

VIII- LES CHANES DE CARACTRE


Lecture de chanes de caractres La bibliothque <string> fournit une mul7tude de fonc7ons pra7ques pour le traitement de chanes de caractres. Voici une brve descrip7on des fonc7ons les plus frquemment u7lises. Dans le tableau suivant, <n> reprsente un nombre du type int. Les symboles <s> et <t> peuvent tre remplacs par : * une chane de caractres constante * le nom d'une variable dclare comme tableau de char * un pointeur sur char (voir chapitre suivant)

VIII- LES CHANES DE CARACTRE


strlen(<s>) strcpy(<s>, <t>) strcat(<s>, <t>) strcmp(<s>, <t>) fournit la longueur de la chane sans compter le '\0' final copie <t> vers <s> ajoute <t> la fin de <s> compare <s> et <t> lexicographiquement et fournit un rsultat: " Ngatif (si <s> prcde <t>) " Zro (si <s> est gal <t>) " Positif (si <s> suit <t>) Ajoute <n> car. de <t> la fin de <s>

strncpy(<s>, <t>, <n>) Copie <n> car. de <t> vers <s> strncat(<s>, <t>, <n>)

VIII- LES CHANES DE CARACTRE


Conversion de chanes de caractres en nombres
atoi(<s>) retourne la valeur numrique reprsente par <s> comme int atol(<s>) retourne la valeur numrique reprsente par <s> comme long atof(<s>) retourne la valeur numrique reprsente par <s> comme double (!)

VIII- LES CHANES DE CARACTRE


Fonc&ons de classica&on et de conversion <ctype.h>
La fonction: isupper(<c>) islower(<c>) isdigit(<c>) isalpha(<c>) isalnum(<c>) isxdigit(<c>) isspace(<c>) retourne une valeur diffrente de zro, si <c> est une majuscule ('A'...'Z') si <c> est une minuscule ('a'...'z') si <c> est un chiffre dcimal ('0'...'9') si islower(<c>) ou isupper(<c>) si isalpha(<c>) ou isdigit(<c>) si <c> est un chiffre hexadcimal ('0'...'9' ou 'A'...'F' ou 'a'...'f') si <c> est un signe d'espacement (' ', '\t', '\n', '\r', '\f)

VIII- LES CHANES DE CARACTRE


Tableaux de chanes de caractres Un tableau de chanes de caractres correspond un tableau deux dimensions du type char, o chaque ligne con&ent une chane de caractres. Dclara&on La dclara7on char JOUR[7][9]; rserve l'espace en mmoire pour 7 mots contenant 9 caractres (dont 8 caractres signica7fs).

VIII- LES CHANES DE CARACTRE


Initialisation mmorisation Lors de la dclaration il est possible d'initialiser toutes les composantes du tableau par des chanes de caractres constantes: char JOUR[7][9]= { "lundi", "mardi", "mercredi", "jeudi","vendredi","samedi","dimanche"};

VIII- LES CHANES DE CARACTRE


Accs aux chanes Il est possible d'accder aux direntes chanes de caractres d'un tableau, en indiquant simplement la ligne correspondante. Exemple char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi","vendredi","samedi", "dimanche"}; int I = 2; prinw("Aujourd'hui, c'est %s !\n", JOUR[I]); achera la phrase : Aujourd'hui, c'est mercredi !

EXERCICES
Ecrire un programme qui permet de saisir une phrase. Vrier si cepe phrase est un palindrome

EXERCICES
#include<stdio.h> #include<conio.h> main() { int a=0; char txt[300]; prinw(Saisir la phrase : ); while(((txt(a)=getchar())!=\n)&(a<299)) {a++;} txt[a+1]=\0; prinw(\n%s,txt); getch(); } #include <stdio.h> #include <conio.h> main() { int i=0,j; char A[500]; prinw(saisir une phrase \n"); gets(A); while(A[i]!='\0') i++; j=i-1; i=0; while((A[i]==A[j])&(i<=j)) { i++; j--; } if(i<j) puts(Pas un palindrome"); else puts("C'est un palindrome"); getch(); }

IX- LES POINTEURS


La plupart des langages de programma7on orent la possibilit d'accder aux donnes dans la mmoire de l'ordinateur l'aide de pointeurs, c.--d. l'aide de variables auxquelles on peut apribuer les adresses d'autres variables. En outre, les pointeurs nous permepent d'crire des programmes plus compacts et plus ecients et fournissent souvent la seule solu7on raisonnable un problme. Ainsi, la majorit des applica7ons crites en C protent de faon extensive des pointeurs.

IX- LES POINTEURS


Adressage direct Dans la programma7on, nous u7lisons des variables pour stocker des informa7ons. La valeur d'une variable se trouve un endroit spcique dans la mmoire interne de l'ordinateur. Le nom de la variable nous permet alors d'accder directement cepe valeur. Adressage direct : Accs au contenu d'une variable par le nom de la variable.

IX- LES POINTEURS


Adressage indirect Si nous ne voulons ou ne pouvons pas u7liser le nom d'une variable A, nous pouvons copier l'adresse de ceUe variable dans une variable spciale P, appele pointeur. Ensuite, nous pouvons retrouver l'informa7on de la variable A en passant par le pointeur P. Adressage indirect : Accs au contenu d'une variable, en passant par un pointeur qui con7ent l'adresse de la variable.

IX- LES POINTEURS


Adressage direct :
Int A=10;

Adressage indirect : Soit A une variable contenant la valeur 10 et P un pointeur qui con7ent l'adresse de A. En mmoire, A et P peuvent se prsenter comme suit :

IX- LES POINTEURS


Dni&on : Un pointeur est une variable spciale qui peut contenir l'adresse d'une autre variable. En C, chaque pointeur est limit un type de donnes. Il peut contenir l'adresse d'une variable simple de ce type ou l'adresse d'une composante d'un tableau de ce type.

IX- LES POINTEURS


Si un pointeur P con7ent l'adresse d'une variable A, on dit : 'P pointe sur A. Remarque : * Un pointeur est une variable qui peut 'pointer' sur direntes adresses. * Le nom d'une variable reste toujours li la mme adresse.

IX- LES POINTEURS


Les oprateurs de base Lors du travail avec des pointeurs, nous avons besoin - d'un oprateur 'adresse de': & pour obtenir l'adresse d'une variable. - d'un oprateur 'contenu de': * pour accder au contenu d'une adresse. - d'une syntaxe de dclara7on: pour pouvoir dclarer un pointeur.

IX- LES POINTEURS


Dclara&on d'un pointeur <Type> *<NomPointeur> dclare un pointeur <NomPointeur> peut recevoir des adresses de variables du type <Type> Exemple de dclara7on : int *PNUM; oat *R1; char *C1;

IX- LES POINTEURS


#include<stdio.h> #include<conio.h> main() { /* dclara7ons */ int A = 10; int B = 50; int *P; /* traitement */ P = &A; B = *P; *P = 20; getch(); } #include<stdio.h> #include<conio.h> main() { /* dclara7ons */ int A, B, *P; /* traitement */ A = 10; B = 50; P = &A; B = *P; *P = 20; getch(); }

IX- LES POINTEURS


Les opra&ons lmentaires sur pointeurs En travaillant avec des pointeurs, nous devons observer les rgles suivantes: Priorit de * et & Les oprateurs * et & ont la mme priorit que les autres oprateurs unaires (la nga7on !, l'incrmenta7on ++, la dcrmenta7on --). Dans une mme expression, les oprateurs unaires *, &, !, ++, -- sont valus de droite gauche. Si un pointeur P pointe sur une variable X, alors *P peut tre u7lis partout o on peut crire X.

IX- LES POINTEURS


Exemples Aprs l'instruc7on : P = &X; les expressions suivantes, sont quivalentes : Y = *P+1 Y = X+1 *P = *P+10 X = X+10 *P += 2 X += 2 ++*P ++X (*P)++ X++

IX- LES POINTEURS


On peut uniquement aecter des adresses un pointeur. Le pointeur NUL Seule excep7on : La valeur numrique 0 (zro) est u7lise pour indiquer qu'un pointeur ne pointe 'nulle part'.

IX- LES POINTEURS


Pointeurs et tableaux En C, il existe une rela7on trs troite entre tableaux et pointeurs. Ainsi, chaque opra7on avec des indices de tableaux peut aussi tre exprime l'aide de pointeurs. En gnral, les versions formules avec des pointeurs sont plus compactes et plus ecientes, surtout l'intrieur de fonc7ons.

IX- LES POINTEURS


Pointeurs et tableaux Comme nous l'avons dj constat plus haut, le nom d'un tableau reprsente l'adresse de son premier lment. En d'autre termes: &tableau[0] et tableau sont une seule et mme adresse. En simpliant, nous pouvons retenir que le nom d'un tableau est un pointeur constant sur le premier lment du tableau.

IX- LES POINTEURS


Pointeurs et tableaux Exemple En dclarant un tableau A de type int et un pointeur P sur int, int A[10]; int *P; l'instruc7on : P = A; est quivalente P = &A[0];

IX- LES POINTEURS

Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la composante suivante. Plus gnralement, P+i pointe sur la i-ime composante derrire P et P-i pointe sur la i-ime composante devant P.

IX- LES POINTEURS


Ainsi, aprs l'instruc7on, P = A; le pointeur P pointe sur A[0], et *(P+1) dsigne le contenu de A[1] *(P+2) dsigne le contenu de A[2] ... ... *(P+i) dsigne le contenu de A[i]

IX- LES POINTEURS


Formalisme tableau et formalisme pointeur Il nous est facile ds lors de 'traduire' un programme crit l'aide du 'formalisme tableau' en un programme employant le 'formalisme pointeur'. Exemple Les deux programmes suivants copient les lments posi7fs d'un tableau T dans un deuxime tableau POS

IX- LES POINTEURS


Formalisme tableau #include<stdio.h> #include<conio.h> main() { int T[10] = {-3,4,0,-7,3,8,0,-1,4,-9}; int POS[10]; int I,J; for (J=0,I=0 ; I<10 ; I++) if (T[I]>0) { POS[J] = T[I]; J++; } getch(); } Formalisme pointeur #include<stdio.h> #include<conio.h> main() { int T[10] = {-3,4,0,-7,3,8,0,-1,4,-9}; int POS[10]; int I,J; for (J=0,I=0 ; I<10 ; I++) if (*(T+I)>0) { *(POS+J) = *(T+I); J++; } getch(); }

IX- LES POINTEURS


Les variables et leur u&lisa&on int A; dclare une variable simple du type int A dsigne le contenu de A &A dsigne l'adresse de A

IX- LES POINTEURS


Les variables et leur u&lisa&on int A; dclare une variable simple du type int A dsigne le contenu de A &A dsigne l'adresse de A int B[]; dclare un tableau d'lments du type int B dsigne l'adresse de la premire composante de B. (Cepe adresse est toujours constante) B[i] dsigne le contenu de la composante i du tableau &B[i] dsigne l'adresse de la composante i du tableau en u7lisant le formalisme pointeur: B+i dsigne l'adresse de la composante i du tableau *(B+i) dsigne le contenu de la composante i du tableau

IX- LES POINTEURS


int B[]; dclare un tableau d'lments du type int B dsigne l'adresse de la premire composante de B. (Cepe adresse est toujours constante) B[i] dsigne le contenu de la composante i du tableau &B[i] dsigne l'adresse de la composante i du tableau

IX- LES POINTEURS


int *P; dclare un pointeur sur des lments du type int. P peut pointer sur des variables simples du type int ou sur les composantes d'un tableau du type int. P dsigne l'adresse contenue dans P (Cepe adresse est variable) *P dsigne le contenu de l'adresse dans P

IX- LES POINTEURS


Si P pointe dans un tableau, alors P dsigne l'adresse de la premire composante P+i dsigne l'adresse de la i-ime composante derrire P *(P+i) dsigne le contenu de la i-ime composante derrire P

IX- LES POINTEURS


Arithm4que des pointeurs Toutes les opra&ons avec les pointeurs &ennent compte automa&quement du type et de la grandeur des objets points. - Aecta7on par un pointeur sur le mme type Soient P1 et P2 deux pointeurs sur le mme type de donnes, alors l'instruc7on P1 = P2; fait pointer P1 sur le mme objet que P2

IX- LES POINTEURS


Arithm4que des pointeurs - Addi7on et soustrac7on d'un nombre en7er Si P pointe sur l'lment A[i] d'un tableau, alors P+n pointe sur A[i+n] P-n pointe sur A[i-n]

IX- LES POINTEURS


Arithm&que des pointeurs - Incrmenta7on et dcrmenta7on d'un pointeur Si P pointe sur l'lment A[i] d'un tableau, alors aprs l'instruc7on P++; P pointe sur A[i+1] P+=n; P pointe sur A[i+n] P--; P pointe sur A[i-1] P-=n; P pointe sur A[i-n]

IX- LES POINTEURS


Arithm&que des pointeurs - Soustrac7on de deux pointeurs Soient P1 et P2 deux pointeurs qui pointent dans le mme tableau: P1-P2 fournit le nombre entre P1 et P2. Le rsultat de la soustrac7on P1-P2 est - nga7f, si P1 prcde P2 - zro, si P1 = P2 - posi7f, si P2 prcde P1 - indni, si P1 et P2 ne pointent pas dans le mme tableau

IX- LES POINTEURS


Arithm&que des pointeurs - Comparaison de deux pointeurs On peut comparer deux pointeurs par <, >, <=, >=, ==, !=. La comparaison de deux pointeurs qui pointent dans le mme tableau est quivalente la comparaison des indices correspondants. (Si les pointeurs ne pointent pas dans le mme tableau, alors le rsultat est donn par leurs posi7ons rela7ves dans la mmoire).

IX- LES POINTEURS


Pointeurs et chanes de caractres - Pointeurs sur char et chanes de caractres constantes Aecta&on a) On peut apribuer l'adresse d'une chane de caractres constante un pointeur sur char: Exemple char *C; C = "Ceci est une chane de caractres constante";

IX- LES POINTEURS


Ini&alisa&on b) Un pointeur sur char peut tre ini7alis lors de la dclara7on si on lui aecte l'adresse d'une chane de caractres constante: char *B = "Bonjour !"; AUen&on ! Il existe une dirence importante entre les deux dclara7ons: char A[] = "Bonjour !"; /* un tableau */ char *B = "Bonjour !"; /* un pointeur */

IX- LES POINTEURS


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 ini7alis de faon ce qu'il pointe sur une chane de caractres constante stocke quelque part en mmoire. Le pointeur peut tre modi et pointer sur autre chose. La chane constante peut tre lue, copie ou ache, mais pas modie.

IX- LES POINTEURS


Modica&on c) Si nous aectons une nouvelle valeur un pointeur sur une chane de caractres constante, nous risquons de perdre la chane constante. D'autre part, un pointeur sur char a l'avantage de pouvoir pointer sur des chanes de n'importe quelle longueur:

IX- LES POINTEURS


Exemple char *A = "Pe7te chane"; char *B = Grande chane un peu plus longue"; A = B; Maintenant A et B pointent sur la mme chane; la "Pe7te chane" est perdue:

IX- LES POINTEURS


L'arithm7que des pointeurs se laisse largir avec toutes ses consquences sur les tableaux deux dimensions. Voyons cela sur un exemple: Le tableau M deux dimensions est dni comme suit: int M[4][10] = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10,11,12,13,14,15,16,17,18,19}, {20,21,22,23,24,25,26,27,28,29}, {30,31,32,33,34,35,36,37,38,39}};

IX- LES POINTEURS


Le nom du tableau M reprsente l'adresse du premier lment du tableau et pointe (oh, surprise...) sur le tableau M[0] qui a la valeur: {0,1,2,3,4,5,6,7,8,9}. L'expression (M+1) est l'adresse du deuxime lment du tableau et pointe sur M[1] qui a la valeur: {10,11,12,13,14,15,16,17,18,19}.

IX- LES POINTEURS


Dclara&on d'un tableau de pointeurs <Type> *<NomTableau>[<N>]dclare un tableau <NomTableau> de <N> pointeurs sur des donnes du type <Type>. Exemple double *A[10]; dclare un tableau de 10 pointeurs sur des ra7onnels du type double dont les adresses et les valeurs ne sont pas encore dnies.

IX- LES POINTEURS


Ini&alisa&on Nous pouvons ini7aliser les pointeurs d'un tableau sur char par les adresses de chanes de caractres constantes. Exemple char *JOUR[] = {"dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"}; dclare un tableau JOUR[] de 7 pointeurs sur char. Chacun des pointeurs est ini7alis avec l'adresse de l'une des 7 chanes de caractres.

IX- LES POINTEURS

IX- LES POINTEURS


On peut acher les 7 chanes de caractres en fournissant les adresses contenues dans le tableau JOUR prin2 (ou puts) : int I; for (I=0; I<7; I++) prinw("%s\n", JOUR[I]);

IX- LES POINTEURS


Comme JOUR[I] est un pointeur sur char, on peut acher les premires lepres des jours de la semaine en u7lisant l'oprateur 'contenu de' : int I; for (I=0; I<7; I++) prinw("%c\n", *JOUR[I]);

IX- LES POINTEURS


L'expression JOUR[I]+J dsigne la J-ime lepre de la I-ime chane. On peut acher la troisime lepre de chaque jour de la semaine par: int I; for (I=0; i<7; I++) prinw("%c\n",*(JOUR[I]+2));

IX- LES POINTEURS


Nous avons vu que l'u7lisa7on de pointeurs nous permet de mmoriser conomiquement des donnes de direntes grandeurs. Si nous gnrons ces donnes pendant l'excu7on du programme, il nous faut des moyens pour rserver et librer de la mmoire au fur et mesure que nous en avons besoin. Nous parlons alors de l'alloca&on dynamique de la mmoire.

IX- LES POINTEURS


Chaque variable dans un programme a besoin d'un certain nombre d'octets en mmoire. Jusqu'ici, la rserva7on de la mmoire s'est droule automa7quement par l'emploi des dclara7ons des donnes. Dans tous ces cas, le nombre d'octets rserver tait dj connu pendant la compila7on. Nous parlons alors de la dclara4on sta4que des variables.

IX- LES POINTEURS


Exemples oat A, B, C; /* rserva7on de 12 octets */ Int D[10][20]; /* rserva7on de 400 octets */ char E[] = {"Bonjour !"}; /* rserva7on de 10 octets */ char F[][10] = {"un", "deux", "trois", "quatre"}; /* rserva7on de 40 octets */

IX- LES POINTEURS


Pointeurs Le nombre d'octets rserver pour un pointeur dpend de la machine et du 'modle' de mmoire choisi, mais il est dj connu lors de la compila7on. Un pointeur est donc aussi dclar sta7quement. Supposons dans la suite qu'un pointeur ait besoin de p octets en mmoire. Exemples double *G; /* rserva7on de p octets */ char *H; /* rserva7on de p octets */ oat *I[10]; /* rserva7on de 10*p octets */

IX- LES POINTEURS


Chanes de caractres constantes L'espace pour les chanes de caractres constantes qui sont aectes des pointeurs ou u7lises pour ini7aliser des pointeurs sur char est aussi rserv automa7quement: Exemples char *J = "Bonjour !"; /* rserva7on de p+10 octets */ char*K[] = {"un", "deux", "trois", "quatre"}; /* rserva7on de 4*p+3+5+6+7 octets */

IX- LES POINTEURS


Problme Souvent, nous devons travailler avec des donnes dont nous ne pouvons pas prvoir le nombre et la grandeur lors de la programma7on. Ce serait alors un gaspillage de rserver toujours l'espace maximal prvisible. Il nous faut donc un moyen de grer la mmoire lors de l'excu7on du programme.

IX- LES POINTEURS


Exemple Nous voulons lire 10 phrases au clavier et mmoriser les phrases en u7lisant un tableau de pointeurs sur char. Nous dclarons ce tableau de pointeurs par: char *TEXTE[10]; Pour les 10 pointeurs, nous avons besoin de 10*p octets. Ce nombre est connu ds le dpart et les octets sont rservs automa7quement. Il nous est cependant impossible de prvoir l'avance le nombre d'octets rserver pour les phrases elles-mmes qui seront introduites lors de l'excu7on du programme ...

IX- LES POINTEURS


Alloca4on dynamique La rserva7on de la mmoire pour les 10 phrases peut donc seulement se faire pendant l'excu&on du programme. Nous parlons dans ce cas de l'alloca4on dynamique de la mmoire.

IX- LES POINTEURS


La fonc7on malloc de la bibliothque <stdlib> nous aide localiser et rserver de la mmoire au cours d'un programme. Elle nous donne accs au tas (heap); c.-- d. l'espace en mmoire laiss libre une fois mis en place le systme, les ges7onnaires, les programmes rsidents, le programme lui-mme et la pile (stack). La fonc4on malloc malloc( <N> )fournit l'adresse d'un bloc en mmoire de <N> octets libres ou la valeur zro s'il n'y a pas assez de mmoire.

IX- LES POINTEURS


Exemple Supposons que nous ayons besoin d'un bloc en mmoire pour un texte de 4000 caractres. Nous disposons d'un pointeur T sur char (char *T). Alors l'instruc7on: T = malloc(4000); fournit l'adresse d'un bloc de 4000 octets libres et l'aecte T. S'il n'y a plus assez de mmoire, T ob7ent la valeur zro.

IX- LES POINTEURS


L'oprateur unaire sizeof sizeof <var> fournit la grandeur de la variable <var> sizeof <const> fournit la grandeur de la constante <const> sizeof (<type>) fournit la grandeur pour un objet du type <type>

IX- LES POINTEURS


Exemple Aprs la dclara7on, short A[10]; char B[5][10]; nous obtenons les rsultats suivants : sizeof A s'value 20 sizeof B s'value 50 sizeof 4.25 s'value 8 sizeof "Bonjour !" s'value 10 sizeof(oat) s'value 4 sizeof(double) s'value 8

IX- LES POINTEURS


Exit : S'il n'y a pas assez de mmoire pour eectuer une ac7on avec succs, il est conseill d'interrompre l'excu7on du programme l'aide de la commande exit (de <stdlib.h>). Free : Si nous n'avons plus besoin d'un bloc de mmoire que nous avons rserv l'aide de malloc, alors nous pouvons le librer l'aide de la fonc7on free de la bibliothque <stdlib.h>. free( <Pointeur> )libre le bloc de mmoire dsign par le <Pointeur>; n'a pas d'eet si le pointeur a la valeur zro.

EXERCICES
Ecrire un programme qui permet de saisir une phrase en formalisme pointeur. Vrier si cepe phrase est un palindrome toujour en formalisme pointeur