Introduction à la programmation en C
Introduction à la programmation en C
MPI
sidimed.ahmed3@[Link] 2
Algorithme
❖ Vient du mathématicien et astronome Muhammad ibn al-Khawarizmi, le
père de l'algèbre, qui formalisa au IXe siècle la notion d'algorithme
❖ Qu’est-ce qu’un Algorithme ?
Un algorithme est une suite ordonnée d’instructions permettant de résoudre
un problème (ou de répondre à un besoin).
❖ Qu’est ce que veut dire « écrire un algorithme »
❖ Analyser et comprendre le problème : étude des données fournies et
des résultats attendus.
❖ Résoudre le problème : Trouver les structures de données adaptées
ainsi que l’enchaînement des actions à réaliser pour passer des
données aux résultats.
❖ Définition : Algorithmique
L’algorithmique est la science des algorithmes.
sidimed.ahmed3@[Link] 3
Exécuté un algorithme
❖ Comment exécuter un algorithme sur un ordinateur ?
Il faut traduire cet algorithme à l’aide d’un langage de programmation
connu par l’ordinateur.
❖ Langage de programmation
Ensemble de règle de vocabulaire et de grammaire compréhensible par un
ordinateur.
❖ La programmation
Écriture d’un programme dans un langage de programmation donnée.
sidimed.ahmed3@[Link] 4
Exécuté un algorithme
Analyse, compréhension
Algorithme
Langage de
Codification programmation
(code)
Programme
Compilation
sidimed.ahmed3@[Link] 5
La programmation en C
❖ Le C a été conçu en 1972 par Dennis Richie et Ken Thompson
❖ Cela signifie qu’un programme C est décrit par un fichier texte, appelé
fichier source.
sidimed.ahmed3@[Link] 6
Premier programme
❖ Le programme suivant permettant d’afficher (bonjour les étudiants de MPI)
#include <stdio.h>
void main()
{
printf("Bonjour les etudiants de MPI!\n");
}
sidimed.ahmed3@[Link] 7
Premier programme
#include <stdio.h>
void main()
{
printf("Bonjour les etudiants de MPI!\n");
}
sidimed.ahmed3@[Link] 8
Les composants élémentaires du C
❖ Un programme en langage C est constitué des six groupes de composants
élémentaires suivants :
✓ les identificateurs
✓ les mots-clefs
✓ les constantes
✓ les chaînes de caractères
✓ les operateurs
✓ les signes de ponctuation.
✓ On peut ajouter à ces six groupes les commentaires, qui sont
enlevés par le processeur
sidimed.ahmed3@[Link] 9
Les identificateurs
❖ Le rôle d’un identificateur est de donner un nom à une entité du
programme.
sidimed.ahmed3@[Link] 1
0
Les mots clefs
❖ Un certain nombre de mots, appelés mots-clefs, sont réservés pour le
langage lui-même et ne peuvent pas être utilisés comme identificateurs.
❖ Le C compte 32 mots clefs que l’on peut ranger en catégories
✓ les spécificateurs de stockage :
• auto, register, static, extern, typedef.
✓ les spécificateurs de type :
• Char, double, enum, float, int, long, short, signed, struct
union, unsigned, void.
✓ les qualificateurs de type :
• Const, volatile.
✓ les instructions de contrôle :
• Break, case, continue, default, do, else, for, goto, if,
switch, while.
✓ Divers : return, sizeof.
sidimed.ahmed3@[Link] 11
Les commentaires en C
❖ Commentaires sur une seule ligne : les commentaires sur une seule ligne
commencent par '//' et s'étendent jusqu'à la fin de la ligne.
❖ Exemple :
#include <stdio.h>
int main() {
// Afficher le message "Hello, World!" à l'écran
printf("Hello, World!\n");
sidimed.ahmed3@[Link] 12
Les commentaires en C
❖ Commentaires sur plusieurs lignes : Les commentaires sur plusieurs lignes
sont inclus entre /* et */ et peuvent s'étendre sur plusieurs lignes.
❖ Par exemple :
/* Ceci est un commentaire */
❖ On ne peut pas imbriquer des commentaires. Quand on met en
commentaire un morceau de programme.
#include <stdio.h>
int main() {
// Afficher le message "Hello, World!" à l'écran
printf("Hello, World!\n");
sidimed.ahmed3@[Link] 13
Les types prédéfinis
❖ Le C est un langage typé. Cela signifie en particulier que toute variable,
constante ou fonction est d’un type précis.
❖ Le type d’un objet définit la façon dont il est représenté en mémoire.
❖ La mémoire de l’ordinateur se décompose en une suite continue d’octets.
❖ Les types de base en C concernent les caractères, les entiers et les flottants
(nombres réels) :
✓ Les type caractères : Le mot-clef char désigne un objet de type caractère
✓ Les types entiers : short, int, long
✓ Les types flottants : float, double
sidimed.ahmed3@[Link] 14
Les types prédéfinis
❖ les différentes précisions possibles :
sidimed.ahmed3@[Link] 15
L’affectation
❖ En C, l’affectation est un opérateur. Elle est symbolisée par le signe =
✓ Sa syntaxe est la suivante : variable = expression
✓ Exemple
void main()
{
int i, j = 2;
float x = 2.5;
i = j + x;
x = x + i;
printf("\n %f \n",x);
}
sidimed.ahmed3@[Link] 16
Les operateurs
❖ Les opérateurs arithmétiques :
✓ + addition
✓ - soustraction
✓ * multiplication
✓ ^ puissance
✓ / division
✓ % reste de la division (modulo)
int main() {
int a = 17;
int b = 5;
// Calcul du reste de la division de a par b
int resultat = a % b;
return 0;
}
sidimed.ahmed3@[Link] 17
Les operateurs
❖ Les opérateurs relationnels :
✓ > strictement supérieur
✓ >= supérieur ou égal
✓ < strictement inférieur
✓ <= inférieur ou égal
✓ == égal
✓ != différent
❖ Leur syntaxe est : expression-1 op expression-2
✓ Les deux expressions sont évaluées puis comparées.
✓ La valeur rendue est de type int (il n’y a pas de type booléen en C)
✓ Elle vaut 1 si la condition est vraie, et 0 sinon.
✓ Attention à ne pas confondre l’opérateur de test d’égalité == avec
l’opérateur d’affection =
sidimed.ahmed3@[Link] 18
Les operateurs
❖ Les opérateurs logiques booléens :
✓ && et logique
✓ || ou logique
✓! négation logique
❖ Comme pour les opérateurs de comparaison, la valeur retournée par ces
opérateurs est un int qui vaut 1 si la condition est vraie et 0 sinon.
❖ Dans une expression de type :
expression-1 op-1 expression-2 op-2 ...expression-n
l’évaluation se fait de gauche à droite et s’ arrête de que le résultat final
est déterminé.
sidimed.ahmed3@[Link] 19
Les operateurs
❖ Les opérateurs d’affectation composée sont :
+= -= *= /= %= &= ^=
✓ Pour tout opérateur op, l’expression
expression-1 op= expression-2 est équivalente à
expression-1 = expression-1 op expression-2
✓ Toutefois, avec l’affection composée, expression-1 n’est évaluée
qu’une seule fois
#include <stdio.h>
int main() {
int a = 5;
// Utilisation de l'opérateur +=
a += 3;
return 0;
}
sidimed.ahmed3@[Link] 20
Les operateurs
❖ Les opérateurs d’incrémentation ++ et de décrémentation -- : s’utilisent
aussi bien en suffixe (i++) qu’en préfixe (++i).
✓ Dans les deux cas la variable i sera incrémentée
✓ toutefois dans la notation suffixe la valeur retournée sera l’ancienne
valeur de i alors que dans la notation préfixe se sera la nouvelle.
✓ Par exemple :
#include <stdio.h>
int main() {
int a = 3, b, c;
b = ++a; /* a et b valent 4 */
c = b++; /* c vaut 4 et b vaut 5 */
return 0;
}
sidimed.ahmed3@[Link] 21
Les fonctions d’entrées-sorties
❖ Il s’agit des fonctions de la librairie standard stdio.h utilisées avec les
unités classiques d’entrées-sorties, qui sont respectivement le clavier et
l’écran.
sidimed.ahmed3@[Link] 22
La fonction d’écriture printf
❖ La fonction printf est une fonction d’impression formatée, ce qui signifie
que les données sont converties selon le format particulier choisi.
❖ Sa syntaxe est
printf("chaine de contrôle ",expression-1, ..., expression-n);
#include <stdio.h>
int main() {
// Utilisation de printf pour afficher du texte
printf("Hello, World!\n");
sidimed.ahmed3@[Link] 23
La fonction d’écriture printf
❖ La chaîne de contrôle contient le texte à afficher et les spécifications de
format correspondant à chaque expression de la liste.
❖ Les spécifications de format ont pour but d’annoncer le format des données
à visualiser.
❖ Elles sont introduites par le caractère %, suivi d’un caractère désignant le
format d’impression.
❖ En plus du caractère donnant le type des données, on peut éventuellement
préciser certains paramètres du format d’impression, qui sont spécifiés
entre le % et le caractère de conversion
// Utilisation de printf avec des formats spécifiques
double pi = 3.14159;
printf("La valeur de pi est : %.2f\n", pi);
sidimed.ahmed3@[Link] 24
La fonction d’écriture printf
❖ Les formats d’impression en C :
✓ %d int
✓ %f double
✓ %c char
✓ %s char* chaîne de caractères
❖ Exemple :
#include<stdio.h>
void main(){
int a =5;
float b =5/3.;
char A = 'c';
char* ch = "Bonjour";
printf("%f \n %d \n %c \n %s", b,a, A, ch);
}
sidimed.ahmed3@[Link] 25
La fonction d’écriture printf
❖ précision :
✓ %.12f signifie qu’un flottant sera imprimé avec 12 chiffres après la virgule.
✓ %10.2f signifie que l’on réserve 12 caractères (incluant le caractère .) pour
imprimer le flottant et que 2 d’entre eux sont destines aux chiffres après la
virgule.
✓ Lorsque la précision n’est pas spécifiée, elle correspond par défaut à 6 chiffres
après la virgule.
#include <stdio.h>
int main() {
double nombre = 123.45678;
// Affichage du nombre avec le format %10.2f
printf("Le nombre formaté est : %10.2f\n", nombre);
return 0;
}
sidimed.ahmed3@[Link] 26
La fonction de saisie scanf
❖ La fonction scanf permet de saisir des données au clavier et de les stocker
aux adresses spécifiées par les arguments de la fonctions.
scanf("chaîne de contrôle", argument-1,...,argument-n)
❖ La chaîne de contrôle indique le format dans lequel les données lues sont
converties. Elle ne contient pas d’autres caractères (notamment pas de \n).
Comme pour printf, les conversions de format sont spécifiées par un
caractère précédé du signe %.
❖ Exemple :
#include<stdio.h>
void main(){
int i;
printf("entrez un entier i = ");
scanf("%d", &i);
printf("i = %d\n", i);
}
sidimed.ahmed3@[Link] 27
Les instructions de branchement conditionnel
❖ On appelle instruction de contrôle toute instruction qui permet de contrôler
le fonctionnement d’un programme.
sidimed.ahmed3@[Link] 28
Branchement conditionnel if---else
❖ La forme la plus générale est celle-ci :
if ( expression-1 )
instruction-1
else if ( expression-2 )
instruction-2
...
else if ( expression-n )
instruction-n
else
instruction-∞
sidimed.ahmed3@[Link] 30
Branchement multiple switch
❖ Sa forme la plus générale est celle-ci :
switch ( expression )
{
case constante-1:
liste d’instructions 1
break;
case constante-2:
liste d’instructions 2
break;
...
case constante-n:
liste d’instructions n
break;
default:
liste d’instructions ∞
break;
}
sidimed.ahmed3@[Link] 31
Branchement multiple switch
❖ Si la valeur de expression est égale à l’une des constantes, la liste
d’instructions correspondant est exécutée.
❖ Sinon la liste d’instructions ∞ correspondant a default est exécutée.
L’instruction default est facultative.
sidimed.ahmed3@[Link] 32
Branchement multiple switch
❖ Exemple :
int day = 4;
switch (day) {
case 6:
printf("Today is Saturday");
break;
case 7:
printf("Today is Sunday");
break;
default:
printf("Looking forward to the Weekend");
}
sidimed.ahmed3@[Link] 33
Les boucles
❖ Les boucles permettent de répéter une série d’instructions tant qu’une
certaine condition n’est pas vérifiée.
❖ En langage C, il existe plusieurs types de boucles qui permettent d'exécuter
un bloc de code plusieurs fois.
❖ Les trois principaux types de boucles sont la boucle for, la boucle while et la
boucle do-while.
sidimed.ahmed3@[Link] 34
Boucle while
❖ Boucle while :
✓ La syntaxe de while est la suivante :
while ( expression ) {
instruction
}
✓ Tant que expression est vérifiée , instruction est exécutée.
✓ Si expression est nulle au départ, instruction ne sera jamais exécutée.
✓ instruction peut évidemment être une instruction composée.
sidimed.ahmed3@[Link] 35
Boucle while
❖ Exemple :
#include <stdio.h>
int main() {
int i = 1;
return 0;
}
sidimed.ahmed3@[Link] 36
Boucle do while
❖ Il peut arriver que l’on ne veuille effectuer le test de continuation qu’aprés
avoir exécuté l’instruction.
❖ Dans ce cas, on utilise la boucle do---while
❖ Sa syntaxe est
do
instruction
while ( expression );
✓ Cela signifie donc que instruction est toujours exécutée au moins une
fois.
sidimed.ahmed3@[Link] 37
Boucle do while
❖ Exemple : saisir au clavier un entier entre 1 et 10 :
#include <stdio.h>
int main() {
int a;
do{
printf("\n Entrez un entier entre 1 et 10 : ");
scanf("%d",&a);
} while ((a <= 0) || (a > 10));
return 0;
}
sidimed.ahmed3@[Link] 38
Boucle for
❖ La syntaxe de for est :
for ( expr 1 ; expr 2 ; expr 3)
instruction
❖ Une version équivalente plus intuitive est :
expr 1;
while ( expr 2 )
{ instruction
expr 3;
}
❖ Par exemple, pour imprimer tous les entiers de 0 à 9, on écrit :
for (int i = 0; i < 10; i++) {
printf("\n i = %d",i);
}
sidimed.ahmed3@[Link] 39
Boucle for
❖ Exemple : imprimer tous les entiers de 0 à 9
#include <stdio.h>
int main() {
int i;
return 0;
}
sidimed.ahmed3@[Link] 40
Branchement non conditionnel break
sidimed.ahmed3@[Link] 41
Branchement non conditionnel break
❖ Exemple, le programme suivant :
#include <stdio.h>
int main() {
int i;
return 0;
}
sidimed.ahmed3@[Link] 42
Branchement non conditionnel break
❖ Le programme imprime à l’ecran
i=0
i=1
i=2
i=3
valeur de i a la sortie de la boucle = 3
sidimed.ahmed3@[Link] 43
Branchement non conditionnel continue
❖ L'instruction continue ignore l'itération actuelle de la boucle et continue à
l'itération suivante.
❖ le programme
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 5; i++) {
if (i == 3)
continue;
printf("i = %d\n",i);
}
return 0;
}
sidimed.ahmed3@[Link] 44
Branchement non conditionnel continue
❖ Le programme imprime à l’ecran
i=0
i=1
i=2
i=4
valeur de i a la sortie de la boucle = 5
sidimed.ahmed3@[Link] 45
Les tableaux
sidimed.ahmed3@[Link] 46
Les tableaux
❖ Déclaration de tableau :
#include <stdio.h>
int main() {
// Déclaration d'un tableau d'entiers de taille 5
int tableau[5];
return 0;
}
sidimed.ahmed3@[Link] 47
Les tableaux
❖ Pour plus de clarté, il est recommandé de donner un nom à la constante
nombre-elements par une directive au préprocesseur, par exemple
• #define nombre-elements 10
❖ On accède à un élément du tableau en lui appliquant l’opérateur [].
❖ Les éléments d’un tableau sont toujours numérotés de 0 à nombre-elements -1
#include <stdio.h>
int main() {
int tableau[5] = {10, 20, 30, 40, 50};
la façon suivante :
sidimed.ahmed3@[Link] 49
Les tableaux
❖ Exemple :
sidimed.ahmed3@[Link] 50
Les tableaux
#include<stdio.h>
#define N 10
void main(){
int tab[N];
int a;
sidimed.ahmed3@[Link] 51
Les tableaux
❖ Un tableau correspond en fait à un pointeur vers le premier élément du
tableau.
❖ Notamment, un tableau ne peut pas figurer à gauche d’un opérateur
d’affectation.
❖ Par exemple, on ne peut pas écrire:
• tab1 = tab2;
❖ Il faut effectuer l’affectation pour chacun des ´éléments du tableau :
sidimed.ahmed3@[Link] 52
Les tableaux
❖ Exemple :
sidimed.ahmed3@[Link] 53
Les tableaux
#include<stdio.h>
#define N 5
void main(){
for(int i=0;i<N;i++)
tab2[i] = tab1[i];
sidimed.ahmed3@[Link] 54
Les tableaux
Exercice :
Ecrire un programme C qui calcule le nombre d’occurrences de la valeur val dans un
tableau Tab de N entiers (de taille 20).
sidimed.ahmed3@[Link] 55
Les tableaux
#include<stdio.h>
#define N 20
void main(){
int tab[N];
int val;
int nboc=0;
for(int i =0; i<N; i++){
printf("Saisir l'element d'indice %d : ", i);
scanf("%d", &tab[i]);
}
for(int i =0; i<N; i++){
printf("l'element d'indicee %d = %d \n",i, tab[i]);
}
printf("Saisir une valeur ");
scanf("%d", &val);
sidimed.ahmed3@[Link] 56
Les tableaux à deux dimensions
❖ Pour initialiser un tableau à plusieurs dimensions on utilise une liste dont chaque
élément est une liste de constantes.
sidimed.ahmed3@[Link] 57
Les tableaux à deux dimensions
❖ Déclaration de tableau à deux dimensions :
#include <stdio.h>
int main() {
// Déclaration d'un tableau à deux dimensions (3x4) d'entiers
int tableau2D[3][4];
return 0;
}
sidimed.ahmed3@[Link] 58
Les tableaux à deux dimensions
❖ Accès aux éléments d'un tableau à deux dimensions :
#include <stdio.h>
int main() {
int tableau2D[2][3] = {{1, 2, 3}, {4, 5, 6} };
return 0;
}
sidimed.ahmed3@[Link] 59
Les tableaux à deux dimensions
❖ Boucle pour parcourir un tableau à deux dimensions :
#include <stdio.h>
int main() {
int tableau2D[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
sidimed.ahmed3@[Link] 60
Les tableaux à deux dimensions
❖ Les accolades imbriquées sont facultatives. L’initialisation suivante est équivalente
à l’exemple précédent :
• int tab[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
❖ Une matrice carrée d’entiers M(N*N) est un tableau à deux dimensions de Taille de
N*N
❖ Exemple : Ecrire un programme C permettant de
• Initialiser une matrice carrée de 16 entiers.
• Afficher le contenu du tableau
• Calculer et afficher le produit des éléments en diagonal
sidimed.ahmed3@[Link] 61
Les tableaux de caractères
❖ De la même manière un tableau de caractères peut être initialisé par une liste de
caractères
• Exemple :
#define N 8
char tab[N] = "exemple";
sidimed.ahmed3@[Link] 62
Les tableaux de caractères
#include<stdio.h>
#define N 8
void main(){
sidimed.ahmed3@[Link] 63
Strings
sidimed.ahmed3@[Link] 64
Strings
#include<stdio.h>
void main(){
sidimed.ahmed3@[Link] 65
Les fonctions des chaines de caractère
❖ void *strcpy (char *chaine1, char *chaine2) // Copy la chaine2 dans chaine1
NCmax caractère.
sidimed.ahmed3@[Link] 66
La taille
#include <stdio.h>
#include <string.h>
int main() {
return 0;
}
sidimed.ahmed3@[Link] 67
strcat()
#include <stdio.h>
#include <string.h>
int main() {
strcat(str1, str2);
printf("%s", str1);
return 0;
}
sidimed.ahmed3@[Link] 68
strcpy()
#include <stdio.h>
#include <string.h>
int main() {
strcpy(str2, str1);
printf("%s", str2);
return 0;
}
sidimed.ahmed3@[Link] 69
strcmp()
#include <stdio.h>
#include <string.h>
int main() {
return 0;
}
sidimed.ahmed3@[Link] 70
Les fonctions
❖ Comme dans la plupart des langages, on peut en C découper un programme
en plusieurs fonctions.
❖ Une seule de ces fonctions existe obligatoirement : c’est la fonction
principale appelée main.
❖ Cette fonction principale peut, éventuellement, appeler une ou plusieurs
fonctions secondaires.
❖ De même, chaque fonction secondaire peut appeler d’autres fonctions
secondaires ou s’appeler elle-même (dans ce dernier cas, on dit que la
fonction est récursive).
sidimed.ahmed3@[Link] 71
Définition d’une fonction
❖ La définition d’une fonction est la donnée du texte de son algorithme, qu’on
appelle corps de la fonction.
sidimed.ahmed3@[Link] 72
Définition d’une fonction
❖ La première ligne de cette définition est l’ entête de la fonction. Dans cet
entête, type désigne le type de la fonction, c’est-`a-dire le type de la valeur
qu’elle retourne.
❖ Contrairement à d’autres langages, il n’y a pas en C de notion de procédure
ou de sous-programme.
❖ Une fonction qui ne renvoie pas de valeur est une fonction dont le type est
spécifié par le mot clef void.
❖ Une fonction possède un et un seul point d'entrée, mais éventuellement
plusieurs points de sortie (à l'aide du mot return).
❖ L'imbrication de fonctions n'est pas autorisée.
sidimed.ahmed3@[Link] 73
Déclaration et appel d’une fonction
// Function definition
void myFunction() {
printf("I just got executed!");
}
sidimed.ahmed3@[Link] 74
Exemples
❖ La fonction Produit permettant de calculer le produit de deux entiers a et b
sidimed.ahmed3@[Link] 75
Exemples
sidimed.ahmed3@[Link] 76
Les prototypes
❖ Il y a trois notions :
• Déclaration
• définition
• Prototype
❖ La déclaration d'une fonction, c'est annoncer que tel identificateur
correspond à une fonction, qui renvoie tel type.
❖ La définition d'une fonction est une déclaration où, en plus, on donne le
code de la fonction elle-même.
❖ Le prototype est une déclaration de fonction où le type des arguments est
également donné.
sidimed.ahmed3@[Link] 77
Les prototypes
❖ Par exemple :
• int f(); /* declaration de f(), renvoyant un int, pas de prototype */
sidimed.ahmed3@[Link] 78
Les prototypes
❖ Exemple :on va écrire une fonction qui renvoie 1 si un nombre entier passé
en paramètre est impair, 0 sinon :
• Donnez son prototype
• Ecrire le code de la fonction
• Écrire également son programme de test (main).
sidimed.ahmed3@[Link] 79
Passage des paramètres par valeur
❖ Quand une fonction est appelée, ses paramètres sont copiés (passage par
valeurs).
❖ La fonction travaille donc sur des copies des paramètres et ne peut donc les
modifier.
❖ En C, le passage des paramètres par référence se fait en utilisant des
pointeurs.
❖ La fonction scanf() travaille avec pointeur, c’est pourquoi du &.
sidimed.ahmed3@[Link] 80
Passage des paramètres par valeur
❖ La fonction changer :
void changer(int n){
n*=2;
printf("La fonction changer n = %d\n",n);
}
❖ La fonction main :
void main(){
int n = 10;
changer(n);
printf("la fonction main n = %d\n",n);
}
sidimed.ahmed3@[Link] 81
Les Pointeurs en C
❖ Un pointeur est une variable particulière, dont la valeur est l'adresse d'une
autre variable.
❖ Un pointeur est une adresse mémoire. On dit que le pointeur p pointe vers i,
puisque p pointe vers l’emplacement mémoire où i est enregistrée.
sidimed.ahmed3@[Link] 82
Les Pointeurs en C
✓ Effectuer les appels par référence (i.e. écrire des fonctions qui
arbre,…)
sidimed.ahmed3@[Link] 83
Déclaration de Pointeurs
❖ Le symbole * est utilisé entre le type et le nom du pointeur
❖ Exemple :
void main(){
int i = 8;
printf("VOICI i: %d\n",i);
printf("VOICI SON ADRESSE EN HEXADECIMAL: %p\n",&i);
}
sidimed.ahmed3@[Link] 84
Manipuler les pointeurs : & (adresse de) et *(contenu)
❖ nom_de_Pointeur = &nom_de_variable
❖ Exemple :
void main(){
p = &c;
printf("%c\n", *p);
p = &d;
printf("%c\n", *p);
sidimed.ahmed3@[Link] 85
Manipuler les pointeurs : * et ++
❖ *p++ signifie :
• *p++ trouver la valeur pointée
• *p++ passer à l’adresse suivante
❖ (*p)++ signifie :
• (*p)++ trouver la valeur pointée
• (*p)++ incrémenter cette valeur (sans changer le pointeur)
❖ *++p signifie:
• *++p incrémenter d’abord le pointeur
• *++p trouver la valeur pointée
sidimed.ahmed3@[Link] 86
Exemple
❖ Donnez le résultat d’exécution :
void main(){
int *p, x, y;
p = &x; /* p pointe sur x */
x = 10; /* x vaut 10 */
y = *p - 1;
sidimed.ahmed3@[Link] 87
Passage des paramètres par valeur et par adresse
❖ a et b: variables locales à main(). La fonction changer ne peut donc pas
modifier leur valeur. On le fait donc en passant par l'adresse de ces
variables.
❖ PASSAGE DES PARAMETRES PAR VALEUR :
void changer(int x, int y){
int tampon;
tampon = x;
x = y;
y = tampon;
}
void main(){
int a = 5 , b = 8;
changer(a,b);
printf(" a=%d\n ", a);
printf(" b=%d\n ", b);
}
sidimed.ahmed3@[Link] 88
Passage des paramètres par valeur et par adresse
❖ PASSAGE DES PARAMETRES PAR ADRESSE :
void changer(int *x,int *y){
int tampon;
tampon = *x;
*x = *y;
*y = tampon;
}
void main(){
int a = 5 , b = 8 ;
changer(&a,&b);
printf(" a=%d\n ", a) ;
printf(" b=%d\n ", b) ;
}
sidimed.ahmed3@[Link] 89
Passage des paramètres par valeur et par adresse
❖ Quand on veut modifier la valeur d'un paramètre dans une fonction, il faut
passer ce paramètre par référence ou adresse
❖ En C, cela se fait par pointeur :
void changer ( int *a, int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
sidimed.ahmed3@[Link] 90
Identification des tableaux et pointeurs
❖ En C, le nom d’un tableau représente l’adresse de sa composante 0.
❖ C'est pour cela que les tableaux passés comme paramètres dans une fonction
sont modifiables.
❖ Passer des tableaux aux fonctions
• Pour le compilateur, un tableau comme argument de fonction, c’est
un pointeur vers sa composante 0 (à la réservation mémoire près).
• La fonction peut donc modifier n’importe quel élément (passage par
référence)
• Le paramètre peut soit être déclaré comme tableau, soit comme
pointeur (int ajouter(int a[], int size) ou int ajouter(int *p, int size))
sidimed.ahmed3@[Link] 91
Identification des tableaux et pointeurs
sidimed.ahmed3@[Link] 92
Structures en C
❖ Exemple :
struct Membre{
char nom[80];
char adresse[200];
int *numero;
float amende[10];
};
sidimed.ahmed3@[Link] 93
Structures en C
sidimed.ahmed3@[Link] 94
Déclarer les structures
struct Membre {
char nom[80];
struct Date {
char adresse[200];
int jour;
int numero;
int mois;
float amende[10];
int an;
struct Date emprunt;
};
struct Date creation;
};
sidimed.ahmed3@[Link] 95
Déclarer les structures
struct Date {
int jour;
int mois;
int an;
};
struct Date paques;
struct Date nouvel_an = { 1, 1, 2001 };
sidimed.ahmed3@[Link] 96
Des structures dans des structures
struct Date {
int jour;
int mois;
int an;
};
sidimed.ahmed3@[Link] 97
Accéder aux membres d’une structure
❖ Les membres sont accédés par le nom de l’instance suivi de . suivi du nom
du membre
struct Membre m;
printf("nom = %s\n", [Link]);
printf("numéro de membre = %d\n", [Link]);
printf("amendes: ");
for(int i = 0; (i < 10) && ([Link][i] > 0.0); i++)
printf("%.2f Euros", [Link][i]);
printf("\nDate d’emprunt %d/%d/%d\n",
[Link], [Link], [Link]);
sidimed.ahmed3@[Link] 98
Assignation des structures
temp = m;
sidimed.ahmed3@[Link] 99
Passer des structures comme paramètres de fonction
❖ Une structure peut être passée, comme une autre variable, par valeur ou par
adresse.
sidimed.ahmed3@[Link] 100
Quand la structure est un pointeur !
❖ Utiliser p->name
sidimed.ahmed3@[Link] 101
Quand la structure est un pointeur !
❖ Utiliser p->name
void main(){
struct Membre m = {
"Med Ali",
"rue de Kuds, 9, 7000 Nass",
42,
{ 0.0 },
{ 0, 0, 0 },
{ 5, 2, 2001 }
};
affiche_membre(&m);
sidimed.ahmed3@[Link] 102