Double pointeur en langage C - déclaration et utilisations
Nous savons déjà qu'un pointeur pointe sur un emplacement en mémoire et sert donc à stocker l'adresse des variables. Donc, quand on définit un pointeur de pointeur. Le premier pointeur est utilisé pour stocker l'adresse de la variable. Et le deuxième pointeur est utilisé pour stocker l'adresse du premier pointeur. C'est pourquoi ils sont également connus comme des doubles pointeurs.
Comment déclarer un double pointeur en C?
Déclarer un double pointeur est similaire à déclarer un pointeur. La différence est que nous devons placer un "*" supplémentaire avant le nom du pointeur.
Syntaxe :
type_donnees **nom_pointeur;
Exemple 1:
int **ptr;
Exemple 2 :
int main(void) { int age = 25; // pointeur vers age int *ptr1; // double pointeur vers ptr1 int **ptr2; // stocker l'adresse de age dans ptr1 ptr1 = &age; // stocker l'adresse de ptr1 dans ptr2 ptr2 = &ptr1; // adresse de age sera affichée printf("adresse de age : %x\n", ptr1); // adresse de ptr1 sera affichée printf("adresse de ptr1: %x\n", ptr2); // La valeur stockée à l'adresse contenue par ptr1, c'est-à-dire 25, sera affichée. printf("Valeur de age en utilisant un seul pointeur : %d\n", *ptr1); // valeur stockée à l'adresse contenue par le pointeur stocké dans ptr2 printf("Valeur de age en utilisant le double pointeur : %d\n", **ptr2); return 0; }
adresse de ptr1: e5f88af0
Valeur de age en utilisant un seul pointeur : 25
Valeur de age en utilisant le double pointeur : 25
Le diagramme ci-dessus montre la représentation en mémoire d'un double pointeur. Le premier pointeur ptr1 stocke l'adresse de la variable age et le deuxième pointeur ptr2 stocke l'adresse du premier pointeur ptr1.
Pourquoi utiliser les doubles pointeurs?
Une des raisons est que vous souhaitez modifier la valeur du pointeur transmis à une fonction en tant qu'argument de la fonction. Pour ce faire, vous avez besoin d'un pointeur sur un pointeur.
En termes simples, utilisez ** lorsque vous souhaitez conserver l’allocation ou affectation de mémoire, même en dehors d’un appel de fonction.
Par exemple, dans des tableaux dynamiques ou dans le cas d'opérations sur une liste liée (supprimer, insérer) où vous devez modifier la valeur du pointeur pointant sur le premier noeud, à partir d'une fonction.