un survol du language c. le language c le language c appartient à une famille de languages (pascal,...

119
Un survol du language C

Upload: noele-avril

Post on 04-Apr-2015

107 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Un survol du language C

Page 2: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Le language C

Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme une série d’instructions. Chaque instruction produit une transformation locale de la mémoire.

Page 3: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les types de données

Toutes les valeurs en C sont du type réel ou entier. En fait il s’agit de deux « familles » de types puisqu’il existe plusieurs sortes d'entiers et de réels. Voici les deux principaux types en C.

int : Les variables de ce type peuvent contenir un nombre entier, qui

reflète typiquement la taille naturelle des nombres entiers sur la

machine utilisée (souvent 32 bits).

double : Les variables de ce type peuvent contenir un nombre réel en

point flottant en double précision (64 bits)

Page 4: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les constantes

Les constantes de type double.

point flottant: 1200.0 3.1416 -.00067

avec exposant: 12e2 31416E-4 -67e-5

mixtes: 1.2e3 3.1416e0 -6.7E-4

Les constantes de type int.

décimales: 17 8 -68

octales: 021 010 -0104 (commence par un zéro)

hexadécimales: 0x11 0X8 -0x44 (commence par 0x ou 0X)

Page 5: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Déclaration des variables

La déclaration des variables se fait selon le modèle suivant:

type variable1, variable2, ... ;

Remarquez la virgule séparant deux variables ainsi que le point-virgule à la fin.

Exemples:

int nbre; définit nbre comme une variable entière

int a,b,c; définit trois variables entières dont les noms respectifs sont a, b et c.

double x; double x; définit x comme une variable réelle.

Page 6: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les opérateurs arithmétiques

+ addition - soustraction* multiplication / division

% opérateur de modulo

} Donne un int si les deux opérandes sont de type int, donne un double sinon

Ne s'applique qu'à des opérandes de type int.Donne un int.

Exemple: 4 % 3 vaut 1 12 % 3 vaut 0 17 % 5 vaut 2

donne le reste de la division entière

}

Page 7: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les opérateurs de comparaisons

=><

= =>> =<< =! =

notation mathématique

notation en Ctype d'opérateur

égalplus grandplus grand ou égalplus petitplus petit ou égaldifférent

Page 8: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les opérateurs logiques

ETOUNON

&& || !

Type d’opérateur Notation en C

Page 9: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

La priorité des opérateurs en C

Opérateurs Associativité

( ) de gauche à droite! de droite à gauche* / de gauche à droite+ - de gauche à droite < <= > >= de gauche à droite== != de gauche à droite&& de gauche à droite|| de gauche à droite = de droite à gauche

Page 10: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les instructions

En C, une instruction est simple ou composée (dans ce dernier cas on parle aussi d'un bloc d'instructions).

Instructions simples: Ex. x = x + 1; y = cos(x); x = cos(x / y - 8) * 2;

Blocs d'instructions:Ex. { x = x + 1; y = cos(x); x = cos(x / y - 8) * 2; }

1 bloc d’instructions

3 instructions simples

Page 11: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Instruction conditionnelle

Forme 1

if (expression) then instruction

L'instruction est évaluée si et seulement si la valeur de l'expression est différente de 0.

= 0 FAUX 0 VRAI

Expression

Page 12: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Instruction conditionnelle

Forme 2

if (expression) theninstruction

elseinstruction

La première instruction est évaluée si la valeur de l'expression est différente de 0, sinon la seconde instruction est évaluée.

Page 13: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Instruction conditionnelle

Forme 3

if (expression) theninstruction

else if (expression) theninstruction

else instruction

Page 14: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Autre forme conditionnelle

switch (expression){ case expression-constante: instruction case expression-constante: instruction default: instructions}

L'expression doit être de type entier. Elle est d'abord évaluée puis l'instruction correspondante est exécutée ainsi que les instructions suivantes.

Page 15: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Autre forme conditionnelle

switch (expression){ case expression-constante: instruction case expression-constante: instruction default: instructions}

L'expression doit être de type entier. Elle est d'abord évaluée puis l'instruction correspondante est exécutée ainsi que les instructions suivantes.

valide: 5

2*3 + 5

non valide:3*x + 5

x

Page 16: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L'instruction break

Pour sortir d'un switch sans exécuter toutes les instructions,on peut utiliser l'instruction break.

Le break peut aussi être utilisé pour sortir des boucles.

Page 17: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple

switch (n) {case 0: printf(“0”);case 1: printf(“1”);case 2: printf(“2”); default: printf(“3”);}

Si n vaut 1 alors le programme affichera simplement: 123

Page 18: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple

switch (n) {case 0: {printf(“0”); break;}case 1: {printf(“1”); break;}case 2: {printf(“2”); break;}default: printf(“3”);}

Si n vaut 1 alors le programme affichera simplement: 1

Page 19: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L'opérateur conditionnel “?:”

expression1 ? expression2 : expresion3

expression1 est d'abord évaluée.Si sa valeur est différente de 0 alors expression2 est évaluéee. Sinon, expression3 est évaluée.

La valeur d'une expression conditionnelle est égale à la valeur de l'expression qui est évaluée (expression2 ou expression3).

Le type d'une expression conditionnelle est le type le plus général entre celui de expression2 et expression3. Donc le type est double si une des deux expression est de type double.

Page 20: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L'opérateur conditionnel “?:”

Exemple:

z = (x<5) ? 1 : 2

(x+1 < y) ? (4*5 + 2) : pow(2,3)

(x<5) ? printf(“1”); : printf(“2”);

Page 21: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

La boucle while

while (expression) instruction

Exemple. Pour afficher les 100 premiers entiers positifs:

int compteur;compteur = 0;while (compteur < 100){

compteur + +; printf(“%d”, compteur);

}

Page 22: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

La boucle do-while

do instruction1 while (expression2)

Équivalent à:

instruction1while (instruction2) instruction1

Exemple. Pour lire et afficher une liste de nombre se terminant par 0.

int n;do{ scanf(“%d”, &n); printf(“%d”, n); }while (n !=0)

Page 23: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

La boucle for

for (expression1 ; expression2 ; expression3) instruction

Équivalent à:

expression1;while(expression2) { instruction expression3; }

Exemple. Pour afficher les n premiers entiers positifs pairs:

int i;for (i=2; i<=2*n; i=i+2) printf(“%d ”, i);

Page 24: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

La bibliothèque standard du C

Il y a peu d'opérateurs arithmétiques en C, mais à partir de ceux que nous avons vus il est possible d'en construire d'autres.

On distingue les opérateurs de base des opérateurs complexe,construits à partir des opérateurs de base, en appelant ces derniers  fonctions.

La plupart des environnements supportants le C standard disposent d'une large collection de fonctions appeléebibliothèque standard.

Page 25: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple: math.h

nx2

Plusieurs fonctions mathématiques courantes font partie de la bibliothèque standard. Pour les utilisées il suffit d'inclure au début du programme la ligne suivante:

#include <math.h>

Il est alors possible d'employer des fonctions telles que:

cos(x) cosinus de xpow(x,y) x à la puissance ysqrt(x) racine carrée de xldexp(x,n)

et plusieurs autres.

Page 26: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Examinons plus en détails la fonction ldexp.

Nous savons que cette fonction retourne la valeur

Considérons quelques exemples:

ldexp(1 , 1) retourne ldexp(1.1, 1) retourneldexp(1, 1.1) retourne

Pourquoi???

Exemple: ldexp(x,n)

nx2

12*12 12*1.12.2

14.22*12 1.1

Page 27: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

22*11) ldexp(1,1.1) ldexp(1,2*1 11.1

Exemple: ldexp(x,n)

Pour comprendre ce qui se passe il faut savoir que la fonction ldexp attend deux nombres en entrée: x et n.

• x doit être un double• n doit être un entier• la fonction retourne un double

Donc lorsque l'on exécute ldexp(1, 1.1), la fonction reçoiten fait les valeurs 1 et 1 puisque la partie fractionnairedu second opérande est tronquée.

Page 28: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Morale: avant d'utiliser une fonction de la bibliothèque il faut connaître son prototype.

Le prototype d'une fonction indique • le nom de la fonction• le type des paramètres • le type de la valeur de retour

Les prototypes de fonctions

Exemple:double ldexp(double, int)

indique que ldexp est une fonction à deux paramètres (un double et un int) qui retourne un double.

Page 29: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple: pow(x,y)

La fonction d'exponentiation a le prototype suivant:

double pow(double x, double y)

de sorte qu'on ne peut pas l'utiliser de la façon suivante:

pow(2, 3) % 5

Question: Pourquoi?

yx y)pow(x,

Page 30: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Il faut plutot écrire:

(int) pow(2, 3) % 5

ou encore

( (int)pow(2,3) ) % 5

L'opérateur cast permet de convertir le type d'une expressionen un autre type.

(type) expression

Exemple: pow(x,y)

Page 31: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Définition des fonctions

Dans la plupart des langages de programmation, la définition d'une fonction comporte deux parties:l'en-tête et le corps.

En-tête

Nom de la fonctionType de la valeur retournéeNom des paramètresTypes des paramètres{

Corps Déclaration des variablesInstructions

Page 32: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les paramètres

Paramètres formels: Ceux utilisés dans la définition.

Paramètres d'appel: Ceux utilisés lors de l'appel.

Page 33: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Passage de paramètres

Par copie: Les paramètres d'appel sont copiés dans les paramètres formels: création de nouvelles variables.

Par référence: Les paramètre formels réfèrent aux paramètres d'appel: plusieurs noms pour une même case mémoire.

Page 34: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L'appel de fonctions

• Créations de nouvelles variables pour chacun des paramètres passés par copie.

•Le contrôle est donné à la fonction: la première ligne du corps de la fonction est d'abord exécutée.

Remarques: Le nom des variables déclarées dans une fonctions est local à cette fonction et il est invisible aux autres fonctions.

Deux fonctions distinctes peuvent utiliser le même identificateur pour nommer deux cases mémoire distinctes.

Page 35: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Retour d'une fonction

À l'intérieur d'une fonction, l'instruction

return expression;

est exécutée de la façon suivante:

• L'expression est d'abord évaluée.• Le résultat est retourné à la fonction appelante• Toutes les variables ayant été créées après l'appel de la fonction sont détruites.• Le contrôle est redonné à la fonction appelante.

Page 36: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Concepts importants

• Utilisations des fonctions pour étendre les possibilités de l'ordinateur.• Prototype d'une fonction• Définition d'une fonction.• Les paramètres • L'appel d'une fonction• Le retour d'une fonction

Page 37: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Structure d'un programme en C

Un programme en C est une collection de fonctions quiinteragissent entre elles afin d'exécuter un calcul.

Une des fonctions doit porter le nom main: c'est la première fonction à être appelée lors de l'exécution du programme.

Comme on l'a vu, on peut utiliser les fonctions de la bibliothèque standard ou encore, on peut définir nos propres fonctions

Page 38: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

La récursion

Nous avons vu qu'un programme est constitué d'un ensemble de fonctions.

Il est possible pour une fonction donnée d'appeler une autre fonction.

Que se passe-t-il si une fonction s'appelle elle-même?

C'est ce que l'on appelle la récursion.

Page 39: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Étude de cas 6.1Pas-à-pas avec n=4

entier n nfactlire n si (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

entier n nfact

.

.

.

.

.

.

n

nfact

entier

entier

Page 40: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire n nfactsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

lire n

.

.

.

.

.

.

4n

nfact

entier

entier

Page 41: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

si (n < 0) alors écrire “entrée négative: ” n

.

.

.

.

.

.

4n

nfact

entier

entier

Page 42: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact nfact factoriel(n)

.

.

.

.

.

.

4n

nfact

entier

entier

Page 43: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

Page 44: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)si (n 1) retourner 1

Page 45: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)retourner n * factoriel(n-1)

Page 46: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

n entier

Page 47: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1

n entier

Page 48: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

retourner n * factoriel(n-1)

n entier

Page 49: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

2

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1retourner n * factoriel(n-1)

n

n entier

entier

Page 50: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

2

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1retourner n * factoriel(n-1)

n

n entier

entier

si (n 1) retourner 1

Page 51: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

2

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1retourner n * factoriel(n-1)

n

n entier

entier

retourner n * factoriel(n-1)

Page 52: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

1

2

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1retourner n * factoriel(n-1)

n

n entier

entier

si (n 1) retourner 1retourner n * factoriel(n-1)

n

entier

Page 53: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

1

2

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1retourner n * factoriel(n-1)

n

n entier

entier

si (n 1) retourner 1retourner n * factoriel(n-1)si (n 1) retourner 1

n

entier

Page 54: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

2

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

si (n 1) retourner 1retourner n *1

n entier

entiern

retourner n * 1

Page 55: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

si (n 1) retourner 1retourner n * factoriel(n-1)

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

3

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)

n entier

retourner n * 2

Page 56: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

4

n

nfact

entier

entier

n entier

si (n 1) retourner 1retourner n * factoriel(n-1)retourner n * 6

Page 57: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

24

n

nfact

entier

entier nfact 24

Page 58: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

24

n

nfact

entier

entier écrire “la factorielle de ” n “est” nfact

Page 59: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

entier n nfactlire nsi (n < 0) alors écrire “entrée négative: ” nsinon nfact factoriel(n) écrire “la factorielle de ” n “est” nfact

.

.

.

.

.

.

4

24

n

nfact

entier

entier

est 24

La factorielle de 4 est 24

Page 60: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

À retenir

• Une fonction peut s'appeler elle-même

• Sans condition d'arrêt, l'exécution de la fonction n'aurait pas de fin.

Page 61: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les adresses

.

.

.

.

.

.

012

34

max

Les cases mémoires ont toutes un numéro qui les distingue lesunes des autres: ce numéro est appelé adresse.

C’est par cette adresse que le processeur peut communiqueravec la mémoire.

Page 62: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les adresses et les variablesLe nom que l’on donne au cases mémoire est traduit en une adresse juste avant l’exécution d’un programme. Cela est nécessaire afin que le processeur sache à quelle case mémoire est associée chaque variable.

En général il est impossible de prévoir à quelle adresse sera placée une variable. Le nom des variables est donc nécessaire.

.

.

.

.

.

.

1324

0c1: 1

2

c2: 34

max

char

char

c1 = c2;

Lire le contenu de la case 3.Mettre ce qui a été lu dans la case 1.

Page 63: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Le partage de la mémoireSur les systèmes modernes il peut y avoir plusieurs usagers se partageant la mémoire et chaque usager peut exécuter plusieurs programmes simultanément.

Cela signifie que l’on n’est pas libre d’utiliser toutes les cases mémoires comme on le veut. Une case peut être occupée par un programme à un certain moment et libre à un autre. Cette situation est aléatoire.

Pour cette raison, on ne mentionne jamais explicitement une adresse dans un programme même si cela est théoriquement possible.

Page 64: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Adresses valides et non valides

Exemple. Dans le pseudo-code suivant:

Lire le contenu de la case 3.Mettre ce qui a été lu dans la case 1.

Que se passe t-il si au moment de l’exécution la case mémoire 1 est déja utilisée par un autre programme.La case est alors non valide et il y aura erreur à l’exécution.

C’est pour cette raison que l’on utilise des variables.Avant l’exécution, une adresse valide est associée à chaque variable. Seul notre programme pourra utiliser ces cases mémoire.

Page 65: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Position des variables dans la mémoire

Sauf pour les tableaux, il n’y a aucune garantie que les variables occupent des cases adjacentes en mémoire.

Exemple.int a,b[4],c,d[3];

......

a

b[0]

b[1]

b[2]

b[3]

......

d[1]

d[2]

......

d[0]

c

int

int

int

int

intint

int

int

int

Page 66: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les adresses et les tableaux

Le nom d’un tableau correspond à l’adresse du début du tableau.

Exemple:

char tab[5];printf(“%p\n”, tab);

4027630992 printf(“%p\n”, tab+1);

4027630993printf(“%p\n”, tab+2);

4027630994

Note: ‘%p’ sert à afficher les adresses.

Page 67: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les tableaux d’entiers

Exemple:

int tab[5];printf(“%p\n”, tab);

4027630976printf(“%p\n”, tab+1);

4027630980printf(“%p\n”, tab+2);

4027630984

Question: Pourquoi?

+4

+4

Page 68: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L’incrémentation d’une adresse

Incrémenter une adresse ne veux pas dire ajouter 1, cela veut dire aller à l’adresse suivant la variable courante.

En général cela n’a du sens que si on est dans un tableau.

......

a: 16216

b[0]: b=24600b[1]: b+1=24604

b[2]: b+2=24608

b[3]: b+3=24612

......

d[1]: d+1=54317

d[2]: d+2=54318

......

d[0]: d=54316

int

int

int

int

int

char

char

char

L’adresse 16220n’est pas valide

Page 69: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Remarque

Si Tab est un tableau alors

L’adresse de Tab[0] est Tab,l’adresse de Tab[1] est Tab + 1,l’adresse de Tab[2] est Tab + 2,etc.

Cela est vrai quelque soit le type des éléments de Tab.

Page 70: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L’opérateur &

Il est possible de connaître, pendant l’exécution d’un programme, l’adresse associée à une variable.

En C, cela est possible à l’aide de l’opérateur unaire &

Exemple:

char c;int n, tab[1000];

L’adresse de c est &cL’adresse de n est &nL’adresse de tab[3] est &tab[3] ou tab+3

Page 71: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

L’opérateur *

Il est aussi possible de connaître, pendant l’exécution d’un programme, le contenu de la case mémoire située à une adresse donnée.

En C, cela est possible à l’aide de l’opérateur unaire *

Exemple:char c;int tab[1000];

• Le contenu de l’adresse tab + 25 est *(tab + 25)• *(tab + 25) est donc identique à tab[25]• *(&c) est identique à c• *c n’a aucun sens

Page 72: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple

Les expressions logiques suivantes sont vraies:

• &n == 12556• *(12560) == 60• *(12560) < c2• *(&r) == 12.345

61

......

12.345

60

5000000

......

char

double

n: 12556 int

c1: 12560 char

r: 12562

c2: 12561

Page 73: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Résumé des opérations sur les adresses

On peut:

• Additionner une adresse et un entier• Déterminer l’adresse d’une variable• Déterminer le contenu d’une adresse

On ne peut pas

• Additionner deux adresses (mais on peut soustraire deux adresses d’un même tableau)

Page 74: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les pointeurs

Un pointeur est une variable pouvant contenir une adresse.

Exemple:

int *pn; pointeur sur une valeur entièrechar *pc; pointeur sur un caractèredouble *pr; pointeur sur un double

Page 75: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les pointeurs et les tableaux

En C les pointeurs sont intimement liés aux tableaux.

Exemple:int tab[10], *p;p=tab;

tab[3] = 70;*(tab + 3) = 70;p[3] = 70;*(p + 3) = 70;

tous équivalent:

Page 76: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

RemarqueLe nom d’un tableau est une adresse constante et non pas un pointeur qui est une variable.

Exemple:int tab[10], *p;p=tab;

p = tab; /* Valide */tab = p; /* Non valide */

tab:

0 1 2 3 4 5 6 7 8 9 10

p:

Page 77: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Quelques utilités des pointeurs

• Pour implanter le passage de paramètres par référence

• Pour implanter le passage de tableaux en paramètre

• Pour utiliser des indices négatifs au tableaux

• Fondamental en structure de données

Page 78: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Le pointeur NULL

Il est parfois utile d'indiquer qu'un pointeur ne contientaucune adresse. On utilise alors le pointeur NULLdont la valeur est 0.

Exemple: int *p;p=NULL;if (p != NULL) printf("%d",*p);

Page 79: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les tableaux à deux dimensions

Exemple: int Tab[N][M]

L’adresse de Tab[i][j] est Tab + i*M + j

......

Tab[0][0]: Tab+0+0 = Tab

......

......

int

int

int

int

int

Tab[0][1]: Tab+0+1 = Tab+1

Tab[1][0]: Tab+2+0 = Tab+2

Tab[1][1]: Tab+2+1 = Tab+3

Tab[2][0]: Tab+4+0 = Tab+4

Tab[2][1]: Tab+4+1 = Tab+5 int

Exemple avec

N=3 et

M=2

Page 80: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les tableaux à deux dimensions

Exemple: int Tab[N][M]

L’adresse de Tab[i][j] est Tab + i*M + j

Remarque: Pour calculer l’ adresse de Tab[i][j] il n ’est pas nécessaire de connaître N mais il est nécessaire de connaître M

Cela explique pourquoi il est nécessaire de préciser Mdans les paramètres formels.

Ex. f(char tab[N][M]) ou f(char tab[][M])

Page 81: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les constantes de type caractère

En C une constante de type caractère est un nombre entier écrit sous la forme d'un caractère entre apostrophes, comme ‘a’.

La valeur d'une constante de type caractère est égale à la valeur du caractère d'après le jeu de caractère de la machine (ex. ASCII).

Exemples:

‘a’ vaut 97‘A’ vaut 65‘B’ vaut 66‘0’ vaut 48

Page 82: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les séquences d'échappement

‘\a’ caractère d'alerte (sonnerie, bell)‘\b’ retour en arrière (backspace)‘\f’ saut de page (formfeed)‘\n’ fin de ligne (newline)‘\r’ retour de chariot (carriage return)‘\t’ tabulation horizontale‘\v’ tabulation verticale‘\\’ backslash‘\?’ point d'interrogation‘\’’ apostrophe‘\” ’ guillemet‘\ooo’ nombre octal‘\xhh’ nombre hexadécimale

Page 83: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les variables de type caractère

En C, les caractères sont des entiers de 8 bits.

Pour déclarer une variable de type caractère, on procède de la façon suivante:

char c1; /* c1 est une variable de type caractère */char c2 = ‘a’; /* c2 est une variable de type caractère

initialisée à 97 */char c3 = 97; /* c3 et c2 contiennent la même valeur */

Page 84: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 1: Copier des fichiers

#include <stdio.h>

/* copie l’entrée sur la sortie; première version*/main(){ int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); }}

Pourquoi un int?

Page 85: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 1: Copier des fichiersLa valeur retourné par getchar() peut être

un des 256 caractères ASCII

OU

la valeur EOF

La fonction getchar() peut donc retourner 257 valeur possibles.

Mais un char est un entier de 8 bits et ne peut donc représenter que 256 valeurs possibles.

On doit donc utiliser plus de bits (et donc un int) pour faire la différence entre un caractère et EOF.

Page 86: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 1: Copier des fichiers

Exemple:Sur un Pentium III, un int est un entier de 32 bits et EOFs’écrit en binaire de la façon suivante:

11111111111111111111111111111111

32 bits

Losrque l’on met EOF dans une variable de type char on nemet que les 8 premiers bits, c’est-à-dire 11111111 = 255

Le caractère dont la valeur est 255 peut être ÿ ou encore le caractère blanc selon le jeu de caractères utilisé.

Page 87: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 1: Copier des fichiers

#include <stdio.h>

/* copie l’entrée sur la sortie, seconde version */main(){ int c; while ((c=getchar()) != EOF) putchar(c);}

Page 88: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les constantes de type chaîne

Un constante de type chaîne est une séquence de caractères, éventuellement vide, placée entre guillemets.

Exemple:“Je suis une chaîne ”

“Bonjour groupe!\n”

“Comment allez-vous\?\n”

Note: Les guillemets ne font pas partie de la chaîne.

Page 89: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les chaînes de caractères

En C il n’y a pas de variable de type chaîne de caractères.

Une chaîne de caractère est un tableau de caractères se terminant par le caractère \0 (le caractère NUL ayant la valeur 0)

Ainsi la chaîne “Bonjour groupe!” serait représentée de la façon suivante:

B o rn j uo gr

0 1 2 3 4 5 6 7 8 9

o u p e ! \0

10 11 12 13 14 15 16

Page 90: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Déclarer un tableau de caractères

Les 4 déclarations suivantes ont le même effet:

char chaine[]={'B','o','n','j','o','u','r',' ','g','r','o','u','p','e','!','\0'};

char chaine[16]={'B','o','n','j','o','u','r',' ','g','r','o','u','p','e','!','\0'};

char chaine[]="Bonjour groupe!";

char chaine[16]="Bonjour groupe!";

B o rn j uo gr

0 1 2 3 4 5 6 7 8 9

o u p e ! \0

10 11 12 13 14 15

Page 91: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Assignation

L'opération suivante est illégale:

char chaine[16];

chaine="Bonjour groupe!";

On ne peut pas assigner de façon dynamique une chaine à un tableau de caractères.

Page 92: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Types composés

En plus des types de base (entier, réels, charactères, etc) il est possible dans la plupart des langages de programmation de définir ses propres types.

Il s’agit en fait de rassembler une ou plusieurs variables, qui peuvent être de types différents, et de les regrouper sous un seul nom afin de les manipuler plus facilement.

Page 93: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple en C

struct complexe { /* défini un nouveau type */ double reel; double imag;};

struct complexe x; /* déclare une variable de type complexe */

x.reel:

x.imag:

Page 94: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Où définir un nouveau type

#include <stdio.h>struct complexe { double reel; double imag;};

fonction(...){struct complexe x;}

Si on défini un nouveau type à l’intérieur d’une fonction alors il ne sera visible qu’à l’intérieur de cette fonction.

Pour qu’un type composé soit visible dans toutes les fonctions d’un fichier, il faut le déclarer au début du fichier, à l’extérieur de toute fonction.

Note: La même chose s’applique à la déclaration de variables: c’est ce que l’on appelle les variables globales.

Page 95: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Assignation de valeurs dans une structures

struct complexe { double reel; double imag;};

struct complexe x;

x.reel = 5;x.imag = 3;

5

3x.reel:

x.imag:

Page 96: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Accéder aux membres d’une structure

struct complexe x, y, z;

x.reel = 5;x.imag = 3;

y = x;

z.reel = x.réel;z.imag = 8;

5

3x.reel:

x.imag:

5y.reel:

3y.imag:

5z.reel:

8z.imag:

Page 97: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Comparer deux structures

if (x == y) printf(“Deux structures égales”);

if (x != z) printf(“Deux structures differentes”);

5

3x.reel:

x.imag:

5y.reel:

3y.imag:

5z.reel:

8z.imag:

Remarque: La comparaison x<y n'est pas valide car elle n'a aucun sens à priori.

Page 98: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les structures et les fonctions

• On peut passer des structures en paramètre.

• On peut utiliser les structures comme valeur de retour.

• Contrairement aux tableaux, les structures sont passées par copie.

Page 99: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

typedef

Dans l’exemple précédent, il est laborieux d’avoir à écrireautant de struct complexe.

Le C fournit une fonctionnalité appelée typedef servant à créer des noms de nouveaux types de données.

Exemple:typedef struct complexe ComplexeComplexe x, y;

Le nom Complexe devient synonyme de struct complexe

Page 100: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Les structures et les pointeurs

Les pointeurs de structures sont si fréquemment utilisés qu’il existe une notation abrégée.

Exemple:struct complexe *pc, x;pc = &x;

pc->reel = 3; /* identique à (*pc).reel=3 */pc->imag = 5; /* identique à (*pc).imag=5 */

Page 101: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Allocation dynamique de la mémoire

Jusqu’à maintenant, toute la mémoire que nous avons utilisée dans nos programmes devait avoir été allouée avantl'exécution à l’aide des déclarations de variables.

Il est parfois utile d’allouer une partie de l’espace mémoireen cours d’exécution.

Page 102: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple

Par exemple si on a besoin de mémoriser un certains nombre d’objets mais que ce nombre n’est pas connu avant l’exécution du programme.

Il faut alors allouer suffisament d’espace au cas ou le nombre d’objet est grand.

Si le nombre d’objets est petits, on gaspille inutilement de l’espace mémoire.

Page 103: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Le fichier d’entête stdlib.h

Le fichier d’entête stdlib.h contient des déclarations de fonctions traitant, entre autres, de l’allocation de la mémoire:

- malloc- free- calloc- realloc

Page 104: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

void *malloc(size_t size)

size_t est le type d’entiers positifs retourné par l’opérateur sizeof

malloc retourne un pointeur sur un espace mémoire réservé à un objet de taille size, ou bien NULL si cette demande ne peut être satisfaite. La mémoire allouée n’est pas initialisée.

Page 105: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Pointeurs sur void

La fonction malloc ne sait pas à quoi servira l’espace mémoire qui lui est demandée.

Elle ne sait pas quel type d’objet utilisera cet espace.

Alors, elle retourne un pointeur générique qui peut être converti en n’inporte quel type de pointeur: un pointeur sur void

Page 106: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

void free(void * p)

free libère l’espace mémoire pointé par p; elle ne fait rien si p vaut NULL.

p doit être un pointeur sur un espace mémoire alloué par malloc, calloc ou realloc.

Page 107: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

void *calloc(size_t nobj, size_t size)

calloc retourne un pointeur sur un espace mémoire réservé à un tableau de nobj objets, tous de taille size, ou bien NULL si cette demande ne peut pas être satisfaite.

La mémoire allouée est initialisée par des zéros.

Page 108: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

void *realloc(void *p, size_t size)

realloc change en size la taille de l’objet pointé par p.

Si la nouvelle taille est plus petite que l’ancienne, seul le début du contenu de l’objet est conservé.

Si la nouvelle taille est plus grande, le contenu de l’objet est conservé, et l’espace mémoire supplémentaire n’est pas initialisé.

realloc retourne un pointeur sur un nouvel espace mémoire, ou bien NULL si cette demande ne peut pas être satisfaite, auquel cas *p n’est pas modifié.

Page 109: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple On veut lire des entiers et les mettre en mémoire.

Plutôt que de créer un tableau avant l’exécution, on utilisecalloc pendant l’exécution.

int *p, n;scanf(“%d”, &n);p = (int *) calloc(n, sizeof(int));

si plus tard cet espace n’est plus suffisant, alors on utilise:

p = (int *) realloc(p, 2*n);

p: …

Page 110: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple Liste chaînée

struct noeud{ int valeur; noeud *suivant;};

struct noeud *chaine, *p;

chaine:

p:

Page 111: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

chaine = (struct noeud) malloc(sizeof(struct noeud));

chaine:

p:

valeur suivant

Page 112: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

chaine = (struct noeud) malloc(sizeof(struct noeud));chaine -> valeur = 8;

chaine: 8

p:

Page 113: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

chaine -> suivant = (struct noeud) malloc(sizeof(struct noeud));

chaine: 8

p:

Page 114: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

p = chaine -> suivant;

chaine: 8

p:

Page 115: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

p -> valeur = 5;

chaine: 8 5

p:

Page 116: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

p -> suivant = (struct noeud) malloc(sizeof(struct noeud));

chaine: 8 5

p:

Page 117: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

p = p -> suivant;

chaine: 8 5

p:

Page 118: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

p -> valeur = 13;p -> suivant = NULL;

chaine: 8 5

p:

13 0

Page 119: Un survol du language C. Le language C Le language C appartient à une famille de languages (Pascal, Cobol, Fortran, etc.) où un programme est vu comme

Exemple 5

p = chaine;while (p != NULL){ printf(“%d\n”, p->valeur); p = p->suivant; }

chaine: 8 5

p:

13 0