Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 1 Chapitre1 Point
Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 1 Chapitre1 Pointeurs et allocation 1.1 Notion de pointeur – Les opérateurs * et & Toute variable posséde : Un nom Une valeur Une adresse en mémoire Exp : int n=5 ; // déclaration d’un entier // (supposons un entier sur 4 octets) //Le nom c’est ‘n’ //La valeur c’est ’5’ //L’adresse c’est son //emplacement dans la mémoire le langage C propose un type de variable permettant de stocker l’adresse d’une autre variable. Ce type de variable est appelé pointeur. 1.1.1 Déclaration d’un pointeur int n ; // Un entier int * adr_int ; // Un pointeur vers un entier (il stocke l’adresse d’un entier) float * ad_fl ; // Un pointeur vers un float (il stocke l’adresse d’un float) 1.1.2 Manipulation du contenu d’un pointeur int * adresse ; // par défaut le système rend une adresse disponible exp 100 *adresse=30 ; // la valeur de l’adresse prend 30 printf (″ la valeur de l’entier stocké à l’adresse %x est %d″,ad, *ad) ; // la valeur de l’entier stocké à l’adresse 100 est 30 1.1.3 L’adresse d’une variable (la référence) Si on veut extraire l’adresse d’une variable déclarée on peut utiliser la référence ‘&’ ; elle rend l’emplacement mémoire de cette variable. int n ; printf(″ l’adresse de n est %x ″, &n) ; Zone réservée à L’entier n pour stocker sa valeur (5) 0X 0100 0X 0101 0X 0102 0X 0103 0X 0104 0X 0105 0X 0106 0X 0107 0X 0108 0X 0109 Type * variable variable pointe vers l’adresse d’un type * adresse Contenu d’une adresse Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 2 // le résultat affiché sera ainsi 0100(c’est l’adresse de début) Exercice : int * ad ; int n ; n=20 ; ad=&n ; *ad=30 ; printf(″ la valeur de n est : %d ″,n) ; // n est égale à 30 Quelle est la valeur de n affichée ? Remarques : int *ad, *ad1, *ad2 ; // ad ad1 et ad2 sont trois pointeurs vers des entiers int *ad,ad1,ad2 ; //ad est un pointeur vers un entier; ad1 et ad2 sont deux entiers Exemples d’application int *ad1, *ad1, *ad2 ; int n=10, p=20 ; ad1=&n ; ad2=&p ; (*ad2)++ ; *ad1=*ad2+2 ; printf(″ la valeur de n est %d ″, n) ; // n = p + 2 1.1.4 Incrémentation des pointeurs int * ad ; // supposons que c’est l’adresse 0x 200 ad++ ; Ce n’est pas l’adresse incrémenté de 1 il s’agit de cette de l’adresse de l’entier suivant. ad ad+1 &variable Adresse d’une variable Zone réservée à L’entier Zone réservée à L’entier Suivant 0X 0200 0X 0201 0X 0202 0X 0203 0X 0204 0X 0205 0X 0206 0X 0207 0X 0208 0X 0209 Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 3 Donc ad ad +sizeof(int) Quelle sera la valeur de ad+5 ?? // 0x 200 + hexa (5*4) = 0x 214 1.1.5 Les pointeurs et les tableaux En langage C l’identificateur d’un tableau est considéré comme un pointeur sur le début d’un tableau. Exp : int tab[4] ; // déclaration d’un tableau de 4 entier Zone mémoire de 4 * // siezof(int) autrement dit 16 octets. tab tab+1 tab+2 tab+3 Ce qui fait que les expressions ci-dessous sont équivalentes : tab &tab[0] tab+i &Tab[i] tab[i] *(tab+i] Exp : initialisation des éléments d’un tableau à 1 int tab[10],i ; for(i=0 ;i<10 ;i++) *(tab+i)=1 ; Autrement : int tab[10],i ; int *p; p=tab; for(i=0; i<10 ; i++,p++) *p=1 ; Zone réservée au premier élément Zone réservée au deuxième élément 0X 0200 0X 0201 0X 0202 0X 0203 0X 0204 0X 0205 0X 0206 0X 0207 0X 0208 0X 0209 0X 020a 0X 020b 0X 020c Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 4 1.1.6 Comparaison de pointeurs En lanage C on ne pourra comparer que des pointeurs qui pointent sur le même type. Exp : int t[10],i ; int t[10] ; for(i=0 ;i<10 ;i++) for(p=t ; p<t+10; p++) t[i]=1 ; (*p)=1 ; 1.1.7 Soustraction de pointeurs le résultat de la comparaison de deux pointeurs de même type est un entier égale a au nombre d’éléments entre les deux pointeurs. Exp : int *p, *q ; double *q1, *p1 p=0x204 ; q=0x200 ; printf(″ %d ″,p-q) ; // la valeur de p – q est 1 p1=0x220 ; q1=0x210 ; printf(″ %d ″,p1-q1) ; // la valeur de p1 – q1 est 2 (10h=16=2*8 //octets) 1.1.8 Le pointeur NULL Il se peut qu’un pointeur ne pointe null part, on aura ainsi à utiliser une valeur bien précise qui est NULL prédéfinie dans la bibliothéque <stdio.h> Exp : Int * n ; … N=NULL ; … If(n==NULL) … 1.2 L’allocation dynamique La déclaration d’une variable ou d’un tableau réalise la réservation d’un emplacement mémoire dont la taille correspond à la taille nécessaire à la variable, cette zone reste réservée tout au long de la durée de vie de la variable. L’allocation de la mémoire est dite statique. L’allocation statique est intéressante lorsque la taille des variables est connue à l’avance, ce qui n’est pas le cas par exemple pour un tableau dont la taille doit être saisie par l’utilisateur. Il est ainsi nécessaire d’allouer la mémoire dynamiquement. Ceci est réalisé à l’aide des fonctions malloc, calloc et realloc définies dans la bibliothèque <stdlib.h> Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 5 La libération de cet espace ce fait à travers la fonction free Exp1 : #include <stdio.h> #include <stdlib.h> void main () { int * p,i ; p=(int *)malloc( sizeof(int)) ; *p=1; i=*p+1; printf(“la valeur à l’adresse %x est%d et i est égale à %d”,p,*p,i) ; free(p) ; } Exp2 : #include <stdio.h> #include <stdlib.h> void main () { int * p_tab, taille,i ; printf(« Donnez la taille du tableau ») ; scanf(«%d », &taille) p_tab=(int *)calloc(taille, sizeof(int)) ; if (p_tab==Null) printf(« allocation echouée ») ; else { for(i=0 ; i<N ;i++) { printf(« Donner une valeur : ») ; scanf(« %d », p_tab+i) ; } for(i=0 ; i<N ;i++) printf(« l’element d’indice %d est %d »,i,*(p_tab+i)) ; free(p_tab); } } Chap 1 Rappel sur les pointeurs et l’allocation de la mémoire 6 malloc: reçoit en argument la taille de l’emplacement à réserver en octets et retourne l’adresse de l’emplacement réservé ou NULL si l’allocation échoue calloc : reçoit en argument un entier n et retourne l’adresse d’un emplacement réservé de taille n * taille de l’élément ou NULL si l’allocation échoue. La fonction calloc initialise de plus tous les éléments de la zone réservée à 0 (zéro). realloc : réalise le redimensionnement d’un emplacement précédemment alloué dynamiquement. Elle reçoit l’adresse du nouvel emplacement, éventuellement inchangée, ou NULL si l’allocation échoue. free : réalise la libération de la zone mémoire allouée située à l’adresse qui lui est passée en argument. Chap2 Les fonctions 7 Chapitre2 Les fonctions Comme tout langage de programmation, C permet le découpage d’un programme en plusieurs parties nommées modules ou encore fonctions, dont une qui est principale ; il s’agit de la fonction main. Cette programmation est dite alors modulaire Une telle division du programme en parties se justifie par de multiples raisons : Un programme qui dépasse deux ou trois pages de code devient difficile à comprendre. Avec la décomposition le programme devient plus lisible. La programmation modulaire permet d’éviter des séquences d’instructions répétitives. La programmation modulaire permet le partage de fonctionnalités qu’on peut mettre au point une seule fois. Dans certains langages, on trouve deux sortes de modules, à savoir : Les fonctions : Assez proche de la notion mathématique, elle dispose ainsi des arguments (elle peut également ne pas en avoir)et fournit un seule résultat désigné par le nom le la fonction. Ce résultat est appelé valeur de retour. Exp : fonction mathématique: f(x)=3x²+2 f(3)29 (valeur de retour) Les procédures : La procédure se diffère de la fonction du fait qu’elle ne dispose pas de valeur de retour. En C, il n’existe qu’une seule sorte de module, nommé fonction. Une fonction reçoit des arguments et fournit un résultat. Exp : y = sqrt(x) ; // une fonction avec un seul argument // fournissant la racine carrée 2.1 Concepts de base 2.1.1 Définition d’une fonction Une fonction est définie comme suit : type nom_fonction (type1 arg1, type2 arg2, … typeN argN) { instructions de la fonction ; return (valeur_retour) ; } Chap2 Les fonctions 8 Exp : Une fonction simple qui calcule la somme de deux entiers et qui fournit le résultat qui est entier. int f_somme(int x, int y) // appel d’une fonction { int val ; val= x+y ; return (val) ; // la valeur fournie } Plusieurs instructions return peuvent apparaître dans une fonction. Le rencontre la première return au sein d’une fonction met fin à cette dernière et la fonction appelante uploads/Litterature/ cours1-pointeurs-et-allocation-ramzi 1 .pdf
Documents similaires










-
28
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Aoû 22, 2021
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 0.4036MB