Vous êtes sur la page 1sur 57

Algorithmique et

Programmation en Langage C
Les Pointeurs
Année Universitaire 2020-2021
Prof. Ousmane SALL
Université de THIES - UFR Sciences et Technologies -Département Informatique
A propos de moi

• Enseignant-Chercheur à l’UFR SET- Université de THIES


https://sites.google.com/a/univ-thies.sn/osall751/
• Enseignements:
• Algorithmique et Programmation(C, Java, PHP)
• Programmation WEB dynamique(HTML 5 CSS, PHP, MySQL, CMS,...)
• Programmation Java, Dart
• Programmation Java, JakartaEE, JSF, Spring, SpringBoot
• Technologies Mobiles Android, Xamarin, Ionic, Flutter
• Programmation .Net, C#
• Gestion de Projet Informatique
• Génie Logiciel, Qualité et Métrique du Logiciel
• Contact:
• osall@univ-thies.sn
• UFR SET, Université de THIES -Dpt Informatique, BP 967 THIES.

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 61


Une sagesse chinoise…

« J’écoute et j’oublie; je lis et je


comprends; je fais et j’apprends »
[Proverbe chinois]

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 62


Contenu
1. Tableaux
2. Chaînes de caractères
3. Pointeurs
4. Sous-algorithmes: Fonctions et Procédures
5. Récursivité
6. Algorithmes de tri
7. Structures et types de données composés
8. Fichiers

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 63


A retenir sur des parties
précédentes

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 64


Erreurs communes
• Ne pas confondre == et =
= est l'opérateur d'affectation, == est l'opérateur de test d'égalité
• Ne pas oublier le signe & dans l'instruction scanf (nombres et caractères)
Exemple: scanf(“%d”, &i);
• Division réelle et division entière: La division est faite en réels si l'un au
moins des deux opérandes est réel, en entiers sinon
• Pas d’espaces, de virgules, \n, etc..., dans la chaîne de format de scanf
Exemple: scanf(“%d%d”, &i, &j);
• Utiliser getchar() pour éliminer les \n qui traînent

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 65


Conseils et suggestions
• Utiliser des doubles plutôt que des float (meilleure précision)
Rappel: printf(“%f”, dbl); et scanf(“%lf”, &dbl);
• Utiliser les accolades même pour les instructions d'une ligne

• Pensez aux #includes : math.h, stdlib.h


• math.h: fonctions mathématiques (ceil, floor, pow...)
• stdlib.h: essentiellement les fonctions rand() et srand()
• Utiliser x*x pour élever x au carré plutôt que pow(x,2)

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 66


Conseils et suggestions: Pour les caractères
accentués – utiliser locale.h

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 67


Arithmétique entière et à virgule flottante
double x;
int i, j;

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 68


Constructions abrégées

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 69


Nombres pseudo-aléatoires
• Voici un petit exemple de programme qui permet d’obtenir des
nombres pseudo-aléatoires entre 0 et 99 :

rand est la fonction qui


retourne un nombre aléatoire à
chaque appel. Ce nombre est
compris entre 0 et
RAND_MAX.
La fonction srand permet
d'initialiser le générateur de
nombres. Elle ne doit être
appelée qu'une seule fois avant
tout appel à rand.

2019-2020 Algorithmique et Programmation en Langage C 70


Nombres pseudo-aléatoires

• srand (time (NULL)) permet d’initialiser le générateur de


nombres pseudo-aléatoire.
• rand() renvoie un nombre entier compris entre 0 et RAND_MAX.
• rand()%100 est donc le reste de la division entière d’un nombre
pseudo-aléatoire (éventuellement très grand) par 100, c’est-à-dire un
nombre compris entre 0 et 99...

2019-2020 Algorithmique et Programmation en Langage C 71


D’autres fonctions utiles avec <math.h>
La fonction abs permet d’obtenir la valeur absolue d’un nombre entier.
La fonction fabsf permet d’obtenir la valeur absolue d’un float.
• Exercice n°2 —Absolument !
• Utilisez cette dernière fonction pour calculer la valeur absolue de (a-b).
• Exercice n°3 —Arrondissez
• La fonction ceilf permet d’obtenir l’arrondi entier supérieur d’un flottant.
Utilisez cette fonction pour calculer l’arrondi supérieur de (a/b).

2019-2020 Algorithmique et Programmation en Langage C 72


Instruction if-else
if (condition) {
... bloc vrai ...
} else {
... bloc faux ...
}

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 73


Opérateurs et connecteurs logiques
• Opérations logiques : ==, !=, <, >, <=, >=
• Connecteurs : &&, ||, !

• Rappel : lois de Morgan


• ! (A && B)équivaut à !A || !B
• ! (A || B)équivaut à !A && !B

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 74


L’instruction switch
switch (variable) {
case valeur1:
... bloc1 ...
break;
case valeur2:
... bloc2 ...
break;
default:
... bloc default ...
}
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 75
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 76
Instructions de boucle : while / do-while
• But : répéter un bloc d’instructions tant qu’une condition est vérifiée
while (condition) { do {
... ...
} } while (condition);

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 77


Boucle de comptage : for
• But : répéter un bloc d’instructions un nombre prédéterminé de fois

• Construction while équivalente

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 78


Les instructions break et continue
• break : interrompt l'exécution d'une boucle

• continue : passe à l'itération suivante d'une boucle

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 79


Exercices
Exercice n°1— Deviner un nombre
En vous aidant de ce qui a été fait précédemment, réalisez un petit jeu
qui :
• Initialise un nombre entre 0 et 99.
• Tente de faire deviner ce nombre à l’utilisateur en lui indiquant si le nombre à
trouver est plus petit ou plus grand que sa proposition.

2019-2020 Algorithmique et Programmation en Langage C 80


Exercices
• Exercice n°3— Deviner un nombre En vous aidant de ce qui a
été fait précédemment, réalisez un petit jeu qui :
• Initialise un nombre entre 0 et 99.
• Tente de faire deviner ce nombre à l’utilisateur en lui indiquant si le nombre à
trouver est plus petit ou plus grand que sa proposition.

2019-2020 Algorithmique et Programmation en Langage C 81


Pointeurs

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 82


Organisation de la mémoire : valeurs et
adresses
• Exemple de contenu de la mémoire

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 83


Variables et mémoire
• Les variables sont des noms symboliques donnés à des cases
mémoire

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 84


Adresse d'une variable : opérateur &

• L'opérateur unaire & donne l'adresse d'une variable

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 85


Le format « %p » permet d’afficher une adresse en hexadécimal. Pour
afficher l'adresse de la variable, on doit utiliser le symbole %p (le p du
mot « pointeur ») dans le printf
Pour manipuler les adresses mémoire des variables, on utilise
des variables d’un type spécial : le type « pointeur »

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 86


Pointeurs: Une variable dont la valeur est
l’adresse d’une autre variable
• Un pointeur est une variable qui permet de stocker
l’adresse d’une autre variable. C'est à dire l'emplacement
de cette dernière au niveau de la mémoire.

On dit que le
pointeur px pointe
sur la variable x.

• Déclaration : type *var;


L’espace après * peut être omis ou placé avant, peu importe. C’est le signe * qui indique que nous avons affaire à
un pointeur. L’indication qui précède * renseigne le compilateur sur le type de case pointée, et comment se
comporteront
Prof. Ousmane SALL,certaines
Univ. Thiès, SNopérations arithmétiques
Programmation Applications Mobiles 87
Utilisation des pointeurs
• Très liés aux tableaux: Permettent de créer des tableaux de taille non
spécifiée au départ
• Une variable tableau est en fait un pointeur sur le début du tableau
en mémoire
• Permettent d'établir des relations entre variables (structures)

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 88


Déréférencement : opérateur *

• L'opérateur unaire * permet d'accéder à la valeur d'une variable


pointée

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 89


Déréférencement et affectation
• L'opérateur unaire * permet de modifier la valeur d'une variable
pointée

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 90


Pointeurs et valeurs pointées
• Attention à bien distinguer valeur du pointeur et valeur pointée par
le pointeur

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 91


Ce qu'il faut avoir compris et ce qu'il faut int x=10;

retenir pour le moment… int *px=&x


printf("%d",x);
printf("%d",px);
• sur une variable, comme la variable x : printf("%d",*px);
• x signifie : Je veux la valeur de la variable x ,
• &x signifie : Je veux l'adresse à laquelle se
trouve la variable x ;
• sur un pointeur, comme px :
• px signifie : Je veux la valeur de px (cette valeur étant
une adresse),
• *px signifie : Je veux la valeur de la variable
qui se trouve à l'adresse contenue dans px .

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 92


Ce qu'il faut avoir compris et ce qu'il faut
retenir pour le moment…
• Attention à ne pas confondre les différentes significations de
l'étoile !
• Lorsque vous déclarez un pointeur, l'étoile sert juste à indiquer
qu'on veut créer un pointeur :
int *px;
• En revanche, lorsqu'ensuite vous utilisez votre pointeur en écrivant :
printf("%d", *px);
. . . cela ne signifie pas Je veux créer un pointeur mais : Je veux la
valeur de la variable sur laquelle pointe mon px.

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 93


Exercices d’Application

Ecrire un programme C qui


utilise la notion de pointeur
pour lire deux entiers et
calculer leur somme.
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 94
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 95
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 96
Exercices d’Application

Ecrire un programme C qui


utilise la notion de pointeur
pour la permuter le contenu
de deux variables de type
char.
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 97
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 98
Pointeurs et tableaux
• Une variable tableau est un pointeur sur le début du tableau en
mémoire

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 99


Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 100
Arithmétique des pointeurs
• Les pointeurs ont une arithmétique particulière liée à l'indexation des
tableaux

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 101


Arithmétique des pointeurs

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 102


Pointeurs particuliers
Là, vous avez un pointeur initialisé à NULL.
• Pointeur non initialisé : pointeur NULL Comme ça, vous saurez dans la suite de votre
programme que votre pointeur ne contient
int *ip = NULL; aucune adresse.

• Pointeur générique : void *ptr

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 103


Exercices d’Application

Expliquer les différences


entre
(*p)++, *p++ et
*(p++)
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 104
Exercices d’Application

Ecrire un programme C qui


remplit un tableau d'entiers
et calcule la somme de ses
éléments en utilisant un
pointeur pour son parcours.
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 105
Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 106
Pointeurs et tableaux multi-dimensionnels
• L'arithmétique des pointeurs traite tous les tableaux avec une seule
dimension

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 107


Tableaux de pointeurs
• La déclaration: int *t[3] déclare un tableau de 3 pointeurs d'entiers

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 108


Tableaux de chaînes de caractères
• But: référencer une suite de chaînes de longueurs différentes

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 109


Piège : équivalence partielle de char* et
char[]
• Dans une déclaration de fonction char * et char[] sont équivalents
int myStrlen(char *str) <=> int myStrlen(char str[])
• Dans une déclaration de variable char * et char[] sont TRES différents

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 110


Pointeurs et allocation dynamique

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 111


Pointeurs et allocation dynamique

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 112


Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 113
Pointeurs de pointeurs

• Un pointeur est une variable, on peut donc en prendre l’adresse

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 114


Pointeurs : résumé
• Pointeur : variable contenant l’adresse d’une autre variable
• L’expression &var a pour valeur l’adresse de var
• L’expression *ptr fait référence à la valeur pointée par ptr
• Les pointeurs ont une arithmétique liée aux tableaux: (ptr+i) pointe
sur la ième variable suivant celle pointée par ptr
• Les pointeurs permettent aux fonctions de retourner plusieurs valeurs
• Les pointeurs permettent d'allouer/manipuler des tableaux
dynamiques

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 115


Webographie
• Tapez "cours langage c" sur GOOGLE http://www.google.sn/
• Le site http://developpez.com
• http://www.siteduzero.com/tutoriel-3-51781-algorithmique-pour-l-
apprenti-programmeur.html
• http://www.siteduzero.com/
• Tapez "cours Algorithmique" sur GOOGLE http://www.google.sn/
•…

Prof. Ousmane SALL, Univ. Thiès, SN Programmation Applications Mobiles 116

Vous aimerez peut-être aussi