Pointeurs et langage C
Les pointeurs Définition Accès aux objets Opérations Ordre de stockage Pointeurs et tableaux Pointeurs et fonctions
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
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
Les pointeurs Définition Accès aux objets Opérations Ordre de stockage Pointeurs et tableaux Pointeurs et fonctions
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 ?
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
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
Les pointeurs Définition Accès aux objets Opérations Ordre de stockage Pointeurs et tableaux Pointeurs et fonctions
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 ?
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;
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 ?
Les pointeurs Définition Accès aux objets Opérations Ordre de stockage Pointeurs et tableaux Pointeurs et fonctions
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.
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
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
Les pointeurs Définition Accès aux objets Opérations Ordre de stockage Pointeurs et tableaux Pointeurs et fonctions
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
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
Les pointeurs Définition Accès aux objets Opérations Ordre de stockage Pointeurs et tableaux Pointeurs et fonctions
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
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
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=0x12345678, 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 ?
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
Allocation mémoire Allocation dynamique et chaîne de caractères char *tab ; tab = (char *) malloc ( 20 * sizeof(int) ) ;
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
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
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) ;
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) ;
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