Cours De Programmation C Chapitre II, VII PDF
Document Details
![VibrantElectricOrgan](https://quizgecko.com/images/avatars/avatar-3.webp)
Uploaded by VibrantElectricOrgan
École nationale des sciences appliquées de Tétouan
2024
Pr. HACHCHANE Imane
Tags
Summary
Cours sur les pointeurs en langage C, pour l'Université d'Ecole Nationale des Sciences Appliquées de Tétouan, 2024.
Full Transcript
1 Pr. HACHCHANE Imane [email protected] Chapitre VII : Introduction aux pointeurs Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 2 Contenu du c...
1 Pr. HACHCHANE Imane [email protected] Chapitre VII : Introduction aux pointeurs Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 2 Contenu du chapitre 1) Notion de pointeur 2) Manipulation des pointeurs 3) Pointeurs et fonctions 4) Pointeurs et tableaux Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 3 Notion de pointeur En langage C, chaque variable créée a une adresse dans la mémoire: Exemple: x = 21; Pour accéder à l’adresse d’une variable, on utilise le &: dans l’exemple : &x contient 3006 Un pointeur est une variable spéciale qui permet de stocker l’adresse d’une autre variable Notation: p = &x; ⇒ on dit p pointe sur x Pour accéder à la valeur de x à partir du pointeur p, on écrit: *p Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 4 Notion de pointeur Exemple: p = &x → p = 3006 *p conNent la valeur 21 N.B: quand p conNent &x, *p peut modifier la valeur de x Intérêt de l’u>lisa>on des pointeurs: Ils permePent de modifier une ou plusieurs variables passées en paramètres dans les foncNons de type void ou d’un autre type: Une fonc'on ne permet de renvoyer qu’une seule valeur avec le return. Si plusieurs variables passées en paramètres sont modifiées dans une fonc'on, on peut par exemple u'liser les pointeurs pour récupérer ce>e modifica'on Ils permePent de créer des structures de données dont le nombre d’éléments peut évoluer dynamiquement (listes chainées et arbres) Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 5 Notion de pointeur Initialisation: un pointeur doit toujours être initialisé, sinon le compilateur ne saura pas sur quelle zone mémoire il pointe On peut initialiser un pointeur avec : l’adresse d’une variable: p1 = &x; un autre pointeur déjà initialisé: p2 = p1; 0 ou NULL: dans ce cas, aucune adresse mémoire ne lui est affectée: p1 = NULL; p2 = 0; Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 6 Manipulation des pointeurs Quand p=&x, la variable *p peut être utilisée dans toutes les opérations à la place de x (opérations arithmétiques, relationnelles, conditionnelles et logiques) Exemples: x=x + 2 → *p=*p + 2 x++ → (*p)++; //parenthèses nécessaires x*(x/2) → (*p)*((*p)/2) //parenthèses souhaitées if(x>n) → if(*p>n) Remplacement dans le scanf(): int x, *p; p = &x; scanf("%d", p); Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 7 Pointeurs et fonctions Définition d’une fonction avec pointeurs: type nom_fonction(type1 *param1, …, type_n *param_n){ instructions; return expression; } Exemple: void affecter(int *a, int *b){ … } Appel de la fonction (cas de variables simples): nom_fonction(¶m1, …,¶m_n); Exemple: int main(){ int a = 2, b = 5; affecter(&a, &b); } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 8 Pointeurs et fonctions Quand une fonction contient des paramètres (ex: maFonction(x,y)) ces derniers servent à transmettre des données nécessaires à l’exécution de la fonction Il existe deux manières de transmettre des paramètres avec les fonctions: Par valeur: technique classique de transmission. Les paramètres effectifs ne subissent aucune modification car uniquement leurs valeurs sont transmises. On peut récupérer la valeur de l’un deux avec un renvoi (avec l’instruction return) Par référence: les adresses des paramètres effectifs sont transmises à la fonction. On utilise pour cela les pointeurs. Dans ce cas, les paramètres effectifs peuvent subir des modifications Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 9 Pointeurs et fonctions Exemple: fonction qui affecte la valeur de a+b à a: Transmission par valeur: int affecter(int a , int b); int main(){ int a = 2, b = 5, c; c = affecter(a, b); printf(″la valeur de a est: %d″, c); } int affecter(int a, int b){ a = a + b; return a; } Résultat : la valeur de a est: 7 Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 10 Pointeurs et fonctions Transmission par reference: #include void affecter(int *x, int y); int main(){ int a = 2, b = 5; affecter(&a, b); printf("la valeur de a est: %d", a); } void affecter(int *x, int y){ *x = *x + y; } Résultat : la valeur de a est: 7 Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 11 Pointeurs et structures Ce qui nous intéresse ici, c'est de savoir comment envoyer un pointeur de structure à une fonction pour que celle-ci puisse modifier le contenu de la variable. On va faire ceci pour cet exemple : on va simplement créer une variable de type Coordonnees dans le main et envoyer son adresse à initialiserCoordonnees. Cette fonction aura pour rôle de mettre tous les éléments de la structure à 0. typedef struct point{ int x; int y; }Coordonnees; int main(int argc, const char * argv[]) { On envoie son adresse à la Coordonnees monPoint; fonction initialiserCoordonnees qui initialiserCoordonnees(&monPoint); récupère cette variable sous la return 0; forme d'un pointeur appelé point } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 12 Pointeurs et structures maintenant que nous sommes dans initialiserCoordonnees, nous allons initialiser chacune des valeurs une à une. void initialiserCoordonnees(Coordonnees * point){ } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 13 Pointeurs et structures maintenant que nous sommes dans iniNaliserCoordonnees, nous allons iniNaliser chacune des valeurs une à une. void initialiserCoordonnees(Coordonnees * point){ Il ne faut pas oublier de mettre une étoile devant le nom du pointeur pour accéder à la variable. Si vous } ne le faites pas, vous risquez de modifier l'adresse, et ce n'est pas ce que nous voulons faire. Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 14 Pointeurs et structures maintenant que nous sommes dans iniNaliserCoordonnees, nous allons iniNaliser chacune des valeurs une à une. void initialiserCoordonnees(Coordonnees* point){ *point.x = 0; *point.y = 0; } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 15 Pointeurs et structures maintenant que nous sommes dans initialiserCoordonnees, nous allons initialiser chacune des valeurs une à une. void initialiserCoordonnees(Coordonnees* point){ Parce que le point de séparation s'applique sur le *point.x = 0; mot point et non sur *point en entier. Or, nous ce *point.y = 0; qu'on veut, c'est accéder à *point pour en modifier } la valeur. Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 16 Pointeurs et structures maintenant que nous sommes dans initialiserCoordonnees, nous allons initialiser chacune des valeurs une à une. void initialiserCoordonnees(Coordonnees* point){ Parce que le point de séparation s'applique sur le *point.x = 0; mot point et non sur *point en entier. Or, nous ce *point.y = 0; qu'on veut, c'est accéder à *point pour en modifier } la valeur. Pour régler le problème, il faut placer des parenthèses autour de *point void initialiserCoordonnees(Coordonnees* point){ (*point).x = 0; (*point).y = 0; } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 17 Pointeurs et structures maintenant que nous sommes dans initialiserCoordonnees, nous allons initialiser chacune des valeurs une à une. void initialiserCoordonnees(Coordonnees* point){ Parce que le point de séparation s'applique sur le *point.x = 0; mot point et non sur *point en entier. Or, nous ce *point.y = 0; qu'on veut, c'est accéder à *point pour en modifier } la valeur. Pour régler le problème, il faut placer des parenthèses autour de *point void initialiserCoordonnees(Coordonnees* point){ (*point).x = 0; (*point).y = 0; } void initialiserCoordonnees(Coordonnees* point){ point->x = 0; point->y = 0; } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 18 Exercices d’applications Donner les valeurs affichées par ce programme: void f1(int *b){ int a = *b; *b = 3*a/2; } int f2(int *x, int b){ (*x)++; return *x/b; } int main(){ int a = 4, b = 11, r; f1(&a); r = f2(&b, a); printf("a=%d ",a); printf("b=%d ",b); printf("r=%d ",r); return 0; } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 19 Exercices d’applications Donner les valeurs affichées par ce programme: void f1(int *b){ int a = *b; *b = 3*a/2; } int f2(int *x, int b){ Résultat: (*x)++; a=6 return *x/b; b = 12 } int main(){ r=2 int a = 4, b = 11, r; f1(&a); r = f2(&b, a); printf("a=%d ",a); printf("b=%d ",b); printf("r=%d ",r); return 0; } Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 20 Exercices d’applications Donner les valeurs des variables pour chaque ligne de ce programme: int main(){ (1) int A = 1 ; int B = 2 ; int C = 3; int *p1 = &A; int *p2 = &B; (2) *p1 =*p2+1; (3) p1 =p2; (4) int*p3 = &C; (5) C = C + 2; A = A + 1; Ligne A B C p1 p2 p3 (6) p1 =p3; return 0; 1 } 2 3 4 5 6 Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 21 Exercices d’applications Donner les valeurs des variables pour chaque ligne de ce programme: int main(){ (1) int A = 1 ; int B = 2 ; int C = 3; int *p1 = &A; int *p2 = &B; (2) *p1 =*p2+1; (3) p1 =p2; (4) int*p3 = &C; (5) C = C + 2; A = A + 1; Ligne A B C p1 p2 p3 (6) p1 =p3; return 0; 1 1 2 3 1 2 } 2 3 2 3 3 2 3 3 2 3 2 2 4 3 2 3 2 2 3 5 4 2 5 2 2 5 6 4 2 5 5 2 5 Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 22 Pointeurs et tableaux Cas d’un tableau à 1 dimension: Notion d’adresse Exemple : int t→ t = &t Le nom du tableau t pointe sur l’adresse du premier élément du tableau (dans l’exemple: t = 2104). A partir de cette adresse, le compilateur peut accéder à tous les éléments du tableau car les emplacements alloués sont contigus t est donc un pointeur constant Programmation en langage C 2024/2025 Chapitre II: Eléments de base du langage C 23 Pointeurs et tableaux Déclaration d’un pointeur de tableau dans les paramètres d’une fonction : type *nompointeur Le tableau est ensuite appelé par son nom dans le main (son nom étant déjà un pointeur) Exemple: void saisieTableau(int *T, int n){... for (P=T ; P