La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Pointeurs et langage C.

Présentations similaires


Présentation au sujet: "Pointeurs et langage C."— Transcription de la présentation:

1 Pointeurs et langage C

2 Les pointeurs Définition Accès aux objets Opérations Ordre de stockage
Pointeurs et tableaux Pointeurs et fonctions

3 Définition Le langage C est prévu pour accéder de manière simple et efficace à toute la mémoire Il fournit le type pointeur qui contient l'adresse d'une case mémoire Son type dépend de l'objet pointé. Certaines opérations arithmétiques sont autorisées L'accès à l'objet pointé est complet À droite du signe d'affectation pour récupérer la donnée À gauche pour la modifier Utilisez ce modèle pour créer des pages Web intranet au sujet de votre groupe de travail ou projet. Vous pouvez ajouter vos propres informations au contenu du modèle et même modifier la structure du site Web en ajoutant ou supprimant des diapositives. Les contrôles de navigation se trouvent sur le masque des diapositives. Pour les modifier, pointez dans le menu Affichage sur Masque, puis cliquez sur Masque des diapositives. Pour ajouter ou supprimer des liens hypertexte sur du texte ou des objets, ou modifier des liens hypertexte, sélectionnez le texte ou l'objet voulu, puis cliquez dans le menu Insertion sur Lien hypertexte. Une fois vos modifications terminées, supprimez ces commentaires pour diminuer la taille de vos fichiers HTML finaux. Pour plus d'informations, interrogez l'aide intuitive sur : Masque des diapositives Liens hypertexte

4 Définit selon le type de l'objet pointé
Définition Un pointeur est : Une variable Contient une adresse Définit selon le type de l'objet pointé Utilisez ce modèle pour créer des pages Web intranet au sujet de votre groupe de travail ou projet. Vous pouvez ajouter vos propres informations au contenu du modèle et même modifier la structure du site Web en ajoutant ou supprimant des diapositives. Les contrôles de navigation se trouvent sur le masque des diapositives. Pour les modifier, pointez dans le menu Affichage sur Masque, puis cliquez sur Masque des diapositives. Pour ajouter ou supprimer des liens hypertexte sur du texte ou des objets, ou modifier des liens hypertexte, sélectionnez le texte ou l'objet voulu, puis cliquez dans le menu Insertion sur Lien hypertexte. Une fois vos modifications terminées, supprimez ces commentaires pour diminuer la taille de vos fichiers HTML finaux. Pour plus d'informations, interrogez l'aide intuitive sur : Masque des diapositives Liens hypertexte

5 Les pointeurs Définition Accès aux objets Opérations Ordre de stockage
Pointeurs et tableaux Pointeurs et fonctions

6 Déclaration d'un pointeur
Type *nomVariablePointeur par exemple int *ptrInt ; // un pointeur sur un entier char *ptrCaractere ; // ptr sur char float *ptrReel ; //pointeur sur un réel Quelle est la taille des variables, en octets, pour chacune de ces déclarations ?

7 Manipulation de pointeur
Deux opérateurs disponibles : & et * & permet d'obtenir l'adresse d'une case mémoire * permet de récupérer la valeur pointée par le pointeur Un pointeur, comme toute variable, doit être initialisé avant son utilisation

8 Manipulation de pointeur
Affectation à partir d'une adresse : int *ptrInt; //ptrInt est un pointeur sur un entier int x ; // x est un entier int y ; // y est un entier x = 10; y = 20; ptrInt = &x; y = *ptrInt; x = 30; y = 40; Faites le plan mémoire correspondant à ces déclarations Indiquez la valeur des variables après chaque instruction

9 Les pointeurs Définition Accès aux objets Opérations Ordre de stockage
Pointeurs et tableaux Pointeurs et fonctions

10 Opérations sur les pointeurs en C
On peut affecter un pointeur à partir d'un autre int tab[100] ; int *p, *q ; q = tab ; p = q ; On peut mettre à jour le contenu pointé *p = 10 ; Que réalise la dernière instruction ?

11 Arithmétique des pointeurs
On peut : Ajouter à un pointeur un entier (p et q : ptr) p = p + 2; Retrancher à un pointeur un entier q = q - 3; Effectuer la différence entre deux pointeurs int dif = p - q;

12 Arithmétique des pointeurs
On ne peut pas Ajouter les pointeurs Multiplier les pointeurs Diviser les pointeurs Pour quelles raisons certaines opérations arithmétiques sont-elles interdites ?

13 Les pointeurs Définition Accès aux objets Opérations Ordre de stockage
Pointeurs et tableaux Pointeurs et fonctions

14 Ordre de stockage La structure de mémoire est basée sur une unité atomique de 1 octet et un incrément d'adresse de 1 octet. Quand un ordinateur enregistre un entier sur 32 bits en mémoire, par exemple 0xA0B70708 en notation hexadécimale, il l'enregistre les octets dans l'ordre qui suit : A0, puis B7, puis 07, puis 08.

15 Ordre de stockage L'octet de poids le plus fort de 0xA0B70708 (ici A0) est enregistré à l'adresse mémoire la plus petite, l'octet de poids inférieur (ici B7) est enregistré à l'adresse mémoire suivante et ainsi de suite. Adresse mémoire Valeur en hexa BFAE45A4 08 BFAE45A3 07 BFAE45A2 B7 BFAE45A1 A0 Big Endian

16 Ordre de stockage Little Endian
L'octet de poids le plus faible de 0xA0B70708 (ici 08) est enregistré à l'adresse mémoire la plus petite, l'octet de poids supérieur (ici 07) est enregistré à l'adresse mémoire suivante et ainsi de suite. Adresse mémoire Valeur en hexa BFAE45A4 A0 BFAE45A3 B7 BFAE45A2 07 BFAE45A1 08 Little Endian

17 Les pointeurs Définition Accès aux objets Opérations Ordre de stockage
Pointeurs et tableaux Pointeurs et fonctions

18 Pointeurs et tableau Le nom d'un tableau correspond à son adresse. Il est possible de le manipuler à l'aide de pointeurs : int tabA[10]; int *ptrA; ptrA = tabA; ptrA = tabA + 9; ptrA = tabA + 10; ptrA = tabA + 11; ptrA = tabA - 1; Indiquez les instructions permises et leurs résultats

19 Donnez le mapping mémoire pour les points A et B
int main() { int a = 1; int b = 2; int c = 3; int *p1, *p2; p1=&a; p2=&c; *p1=(*p2)+1; A) *p1=(*p2)++; p1=p2; p2=&b; *p2=(*p2)*(*p1); B) return 0; } Donnez le mapping mémoire pour les points A et B

20 Les pointeurs Définition Accès aux objets Opérations Ordre de stockage
Pointeurs et tableaux Pointeurs et fonctions

21 Pointeurs et fonctions
void change(int v1, int v2) { int tmp ; tmp = v1 ; B v1 = v2 ; v2 = tmp ; C } int main() { int val1, val2 ; val1 = 1 ; val2 = 2 ; A change(val1,val2) ; D return 0 ; } Donnez le mapping mémoire pour les points A, B, C et D

22 Pointeurs et fonctions
void change(int *ptr, int *ptr2) { int val1 ; val1 = *ptr ; B *ptr2 = val1 ; *ptr = 0 ; C } int main() { int val1, val2 ; int *ptrVal1 ; val1 = 1 ; val2 = 2 ; ptrVal1 = &val1 ; A change(ptrVal1,&val2) ; D return 0 ; } Donnez le mapping mémoire pour les points A, B, C et D

23 Opérateur de cast unsigned char *ptrOctet; int unEntier;
Il permet de forcer le type unsigned char *ptrOctet; int unEntier; ptrOctet = &unEntier; warning: assignment from incompatible pointer type unsigned char *ptrOctet; int unEntier=0x , i; ptrOctet = (char *)&unEntier ; for(i=0;i<sizeof(unEntier);i++){ printf("%04X : %02X\n", ptrOctet, *ptrOctet) ; ptrOctet++; } Le mode de stockage est-il big ou little endian ?

24 Allocation mémoire type Taille du type Allocation statique
int tab[20] ; Allocation dynamique int *tab ; tab = (int *) malloc ( 20 * sizeof(int) ) ; type Taille du type Nombre de "cases" à réserver

25 Allocation mémoire Allocation dynamique et chaîne de caractères
char *tab ; tab = (char *) malloc ( 20 * sizeof(int) ) ;

26 Allocation mémoire Allocation statique et chaîne de caractères
char nom[50] ; char prenom[50] ; char adr[100] ; strcpy(nom,"toto") ; // perte de 45 octets strcpy(prenom,"titi") ; // perte de 45 octets strcpy(adr,"rien") ; // perte de 95 octets // en tout 200 octets réservés pour seulement 15 utilisés

27 Allocation mémoire Allocation dynamique et chaîne de caractères
char *nom ; char *prenom ; char *adr ; nom = (char *) malloc ((strlen("toto")+1) * sizeof(char)) ; strcpy(nom,"toto") ; prenom = (char *) malloc ((strlen("titi")+1) * sizeof(char)) ; strcpy(prenom,"titi") ; adr = (char *) malloc ((strlen("rien")+1) * sizeof(char)) ; strcpy(adr,"toto") ; // en tout 15 octets réservés pour 15 utilisés

28 Allocation mémoire Allocation dynamique et chaîne de caractères avec intéraction utilisateur : char *nom ; char *prenom ; char buffer[50]; scanf("%s",buffer) ; nom = (char *) malloc ((strlen(buffer)+1) * sizeof(char)) ; strcpy(nom,buffer) ; prenom = (char *) malloc ((strlen(buffer)+1) * sizeof(char)) ; strcpy(prenom,buffer) ;

29 Libération de la mémoire
Pour libérer la mémoire alloué dynamiquement on utilise la fonction free. char *nom ; char buffer[50]; scanf("%s",buffer) ; nom = (char *) malloc ((strlen(buffer)+1) * sizeof(char)) ; strcpy(nom,buffer) ; free(nom) ;

30 Résumé Un pointeur est une variable contenant l'adresse mémoire d'une valeur typée. val : valeur de la variable &val : adresse de la variable val *ptrVal : valeur se trouvant à l'adresse donnée par ptrVal Attention au type du pointeur → le nombre d'octets d'un incrément dépend de la taille du type


Télécharger ppt "Pointeurs et langage C."

Présentations similaires


Annonces Google