11. Les pointeurs

 
Les pointeurs - SAGProfProg - LANGAGE C - Programmation, Développement web, Développement d'application, Génie Logiciel, Langage de programmation, Application web, Tutos, Informatique, Système d'information, Administration d'application
Les pointeurs - SAGProfProg - LANGAGE C - Programmation, Développement web, Développement d'application, Génie Logiciel, Langage de programmation, Application web, Tutos, Informatique, Système d'information, Administration d'application


Le pointeur en langage C est une variable qui contient l'adresse d'une autre variable. Cette variable peut être de type int, char, array, function ou tout autre pointeur. La taille du pointeur dépend de l'architecture. Cependant, dans une architecture 32 bits, la taille d'un pointeur est de 2 octets.

Considérez l'exemple suivant pour définir un pointeur qui stocke l'adresse d'un entier.

int n = 10 ;

int* p = &n; // La variable p de type pointeur pointe vers l'adresse de la variable n de type entier.

Déclarer un pointeur

Le pointeur en langage c peut être déclaré en utilisant * (symbole astérisque). Il est également connu sous le nom de pointeur d'indirection utilisé pour déréférencer un pointeur.

int *a;//pointeur vers int

char *c;//pointeur vers char

Exemple de pointeur

Un exemple d'utilisation de pointeurs pour imprimer l'adresse et la valeur est donné ci-dessous.



Comme vous pouvez le voir dans la figure ci-dessus, la variable de pointeur stocke l'adresse de la variable numérique, c'est-à-dire fff4. La valeur de la variable nombre est 50. Mais l'adresse de la variable pointeur p est aaa3.

A l'aide de * (opérateur d'indirection), on peut imprimer la valeur de la variable pointeur p.

Voyons l'exemple de pointeur comme expliqué pour la figure ci-dessus.

#include<stdio.h>

int main(){

int nombre= 50 ;

int *p ;

p=&nombre;//stocke l'adresse de la variable numéro

printf("L'adresse de la variable p est %x \n",p); // p contient l'adresse du nombre donc imprimer p donne l'adresse du nombre.

printf("La valeur de la variable p est %d \n",*p); // Comme on sait que * sert à déréférencer un pointeur donc si on imprime *p, on obtiendra la valeur stockée à l'adresse contenue par p.

return 0 ;

}

Production



Pointeur vers le tableau

int arr[10] ;

int *p[10]=&arr; // La variable p de type pointeur pointe vers l'adresse d'un tableau d'entiers arr.

Pointeur vers une fonction

void show(int);

void(*p)(int) = &display; // Le pointeur p pointe vers l'adresse d'une fonction

Pointeur vers la structure

struct st {

     int i ;

     float f ;

}ref ;

struct st *p = &ref;



Avantage du pointeur

1) Le pointeur réduit le code et améliore les performances, il est utilisé pour récupérer des chaînes, des arbres, etc. et utilisé avec des tableaux, des structures et des fonctions.

2) Nous pouvons renvoyer plusieurs valeurs d'une fonction à l'aide du pointeur.

3) Il vous permet d'accéder à n'importe quel emplacement de mémoire dans la mémoire de l'ordinateur.

Utilisation du pointeur

Il existe de nombreuses applications des pointeurs en langage c.

1) Allocation de mémoire dynamique

En langage c, nous pouvons allouer dynamiquement de la mémoire en utilisant les fonctions malloc() et calloc() où le pointeur est utilisé.

2) Tableaux, fonctions et structures

Les pointeurs en langage c sont largement utilisés dans les tableaux, les fonctions et les structures. Il réduit le code et améliore les performances.

Adresse de (&) Opérateur

L'adresse de l'opérateur '&' renvoie l'adresse d'une variable. Mais, nous devons utiliser %u pour afficher l'adresse d'une variable.

#include<stdio.h>

int main(){

int nombre= 50 ;

printf("la valeur du nombre est %d, l'adresse du nombre est %u",nombre,&nombre);

return  0 ;

}


Pointeur nul

Un pointeur auquel aucune valeur n'est assignée mais NULL est appelé pointeur NULL. Si vous n'avez pas d'adresse à spécifier dans le pointeur au moment de la déclaration, vous pouvez affecter la valeur NULL. Cela fournira une meilleure approche.

int *p=NULL ;

Dans la plupart des bibliothèques, la valeur du pointeur est 0 (zéro).

Pointer Programme pour échanger deux nombres sans utiliser la 3ème variable.

#include<stdio.h>

int main(){

int a=10,b=20,*p1=&a,*p2=&b;

printf("Avant permutation : *p1=%d *p2=%d",*p1,*p2);

*p1=*p1+*p2 ;

*p2=*p1-*p2 ;

*p1=*p1-*p2 ;

printf("\nApres echange : *p1=%d *p2=%d",*p1,*p2);

return 0 ;

}

Production



Lecture de pointeurs complexes

Il y a plusieurs choses qui doivent être prises en considération lors de la lecture des pointeurs complexes en C. Voyons la priorité et l'associativité des opérateurs qui sont utilisés concernant les pointeurs.

<TABLEAU>

Ici, il faut remarquer que,

  • () : cet opérateur est un opérateur entre parenthèses utilisé pour déclarer et définir la fonction.
  • [] : cet opérateur est un opérateur d'indice de tableau
  • * : Cet opérateur est un opérateur de pointeur.
  • Identifiant : C'est le nom du pointeur. La priorité lui sera toujours attribuée.
  • Type de données : le type de données est le type de la variable vers laquelle le pointeur est censé pointer. Il inclut également le modificateur comme signé int, long, etc.).

Comment lire le pointeur : int (*p)[10].

Pour lire le pointeur, nous devons voir que () et [] ont la même priorité. Par conséquent, leur associativité doit être considérée ici. L'associativité est de gauche à droite, donc la priorité va à ().

À l'intérieur du crochet (), l'opérateur de pointeur * et le nom de pointeur (identifiant) p ont la même priorité. Par conséquent, leur associativité doit être considérée ici qui est de droite à gauche, donc la priorité va à p, et la deuxième priorité va à *.

Attribuez la 3e priorité à [] puisque le type de données a la dernière priorité. Par conséquent, le pointeur ressemblera à ce qui suit.

  • caractère -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

Le pointeur sera lu comme p est un pointeur vers un tableau d'entiers de taille 10.

Exemple

Comment lire le pointeur suivant ?

int (*p)(int(*)[2], int (*)void))

Explication

Ce pointeur sera lu comme p est un pointeur vers une telle fonction qui accepte le premier paramètre comme pointeur vers un tableau unidimensionnel d'entiers de taille deux et le deuxième paramètre comme pointeur vers une fonction dont le paramètre est void et le type de retour est l'entier.




Aucun commentaire

Fourni par Blogger.