** en C

Jagathish 12 octobre 2023
  1. Allocation de mémoire pour la variable en C
  2. Pointeur C
  3. Pointeur à pointeur (**) en C
** en C

Ce didacticiel explique comment utiliser le pointeur vers pointeur (double pointeur ou **) pour stocker l’adresse d’une autre variable de pointeur.

Allocation de mémoire pour la variable en C

Lors de la création d’une variable, il y aura un bloc de mémoire spécifique alloué à cette variable pour stocker la valeur. Par exemple, nous avons créé une variable char ch et une valeur a. En interne, un octet de mémoire sera alloué à la variable ch.

Allocation de mémoire

Pointeur C

En programmation C, un pointeur est une variable qui stocke l’adresse d’une autre variable. Pour accéder à la valeur présente dans cette adresse, nous utilisons *.

Illustration de pointeur

#include <stdio.h>

int main() {
  char ch = 'a';    // create a variable
  char *ptr = &ch;  // create a pointer to store the address of ch

  printf("Address of ch: %p\n", &ch);  // prints address
  printf("Value of ch: %c\n", ch);     // prints 'a'

  printf("\nValue of ptr: %p\n", ptr);  // prints the address of a
  printf("*ptr(value of ch): %c\n",
         *ptr);  // Prints Content of the value of the ptr
}

Production:

Address of ch: 0x7ffc2aa264ef
Value of ch: a

Value of ptr: 0x7ffc2aa264ef
*ptr(value of ch): a

Dans le code ci-dessus,

  • Création d’une variable char ch et assignation du caractère a comme valeur.
  • Création d’un pointeur char ptr et stockage de l’adresse de la variable ch.
  • Imprimé l’adresse et la valeur de ch.
  • Imprimé la valeur du ptr, la valeur de ptr sera l’adresse de ch
  • Imprimé la valeur de ch en utilisant *ptr. La valeur de ptr est l’adresse de la variable ch, dans cette adresse, la valeur 'a' est présente, elle sera donc imprimée.

Pointeur à pointeur (**) en C

Pour stocker l’adresse d’une variable, on utilise un pointeur. De même, pour stocker l’adresse d’un pointeur, il faut utiliser ** (pointeur à pointeur). ** désigne un pointeur qui stocke l’adresse d’un autre pointeur.

Pour imprimer la valeur présente dans la variable pointeur à pointeur, nous devons utiliser **.

Illustration de pointeur à pointeur

#include <stdio.h>

int main() {
  char ch = 'a';           // create a variable
  char *ptr = &ch;         // create a pointer to store the address of ch
  char **ptrToPtr = &ptr;  // create a pointer to store the address of ch

  printf("Address of ch: %p\n", &ch);  // prints address of ch
  printf("Value of ch: %c\n", ch);     // prints 'a'

  printf("\nValue of ptr: %p\n", ptr);   // prints the address of ch
  printf("Address of ptr: %p\n", &ptr);  // prints address

  printf("\nValue of ptrToPtr: %p\n", ptrToPtr);  // prints the address of ptr
  printf("*ptrToPtr(Address of ch): %p\n",
         *ptrToPtr);  // prints the address of ch
  printf("**ptrToPtr(Value of ch): %c\n", **ptrToPtr);  // prints ch
}

Production:

Address of ch: 0x7fffb48f95b7
Value of ch: a

Value of ptr: 0x7fffb48f95b7
Address of ptr: 0x7fffb48f95b8

Value of ptrToPtr: 0x7fffb48f95b8
*ptrToPtr(Address of ch): 0x7fffb48f95b7
**ptrToPtr(Value of ch): a

Dans le code ci-dessus,

  • Créer une variable char ch et lui attribuer le caractère a comme valeur.
  • Création d’un pointeur char ptr et stockage de l’adresse de la variable ch.
  • Création d’un pointeur char vers le pointeur ptrToPtr et stockage de l’adresse de la variable ptr.
  • Le ptr aura pour valeur l’adresse de la variable ch, et le ptrToPtr aura pour valeur l’adresse du pointeur ptr.
  • Quand on déréférence le ptrToPtr comme *ptrToPtr on obtient l’adresse de la variable ch
  • Quand on déréférence le ptrToPtr comme **ptrToPtr on obtient la valeur de la variable ch

Point à retenir

Afin de stocker l’adresse de ptrToPtr, nous devons créer

char ***ptrToPtrToPtr = &ptrToPtr;
printf("***ptrToPtrToPtr : %c\n", ***ptrToPtrToPtr);  // 'a'

Article connexe - C Pointer