** 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
.
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 *
.
#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èrea
comme valeur. - Création d’un pointeur
char
ptr
et stockage de l’adresse de la variablech
. - Imprimé l’adresse et la valeur de
ch
. - Imprimé la valeur du
ptr
, la valeur deptr
sera l’adresse dech
- Imprimé la valeur de
ch
en utilisant*ptr
. La valeur deptr
est l’adresse de la variablech
, 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 **
.
#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èrea
comme valeur. - Création d’un pointeur
char
ptr
et stockage de l’adresse de la variablech
. - Création d’un pointeur
char
vers le pointeurptrToPtr
et stockage de l’adresse de la variableptr
. - Le ptr aura pour valeur l’adresse de la variable
ch
, et leptrToPtr
aura pour valeur l’adresse du pointeurptr
. - Quand on déréférence le
ptrToPtr
comme*ptrToPtr
on obtient l’adresse de la variablech
- Quand on déréférence le
ptrToPtr
comme**ptrToPtr
on obtient la valeur de la variablech
Point à retenir
Afin de stocker l’adresse de ptrToPtr
, nous devons créer
char ***ptrToPtrToPtr = &ptrToPtr;
printf("***ptrToPtrToPtr : %c\n", ***ptrToPtrToPtr); // 'a'