Ni en C ni en C++, la valeur du pointeur nul n'est liée de quelque manière que ce soit à l'adresse physique. 0
. Le fait que vous utilisiez la constante 0
dans le code source pour mettre un pointeur sur une valeur nulle n'est rien de plus qu'un morceau de sucre syntaxique . Le compilateur doit la traduire en l'adresse physique réelle utilisée comme valeur du pointeur nul sur la plate-forme spécifique.
En d'autres termes, 0
dans le code source n'a aucune importance physique. Il aurait pu être 42
o 13
par exemple. C'est-à-dire que les auteurs de la langue, s'ils le voulaient, auraient pu faire en sorte que vous deviez faire p = 42
afin de placer le pointeur p
à une valeur de type null-pointer. Encore une fois, cela ne signifie pas que l'adresse physique 42
devrait être réservé aux pointeurs nuls. Le compilateur serait tenu de traduire le code source p = 42
en code machine qui remplirait la valeur physique réelle du pointeur nul ( 0x0000
o 0xBAAD
) dans le pointeur p
. C'est exactement comme ça que ça se passe maintenant, avec une constante 0
.
Notez également que ni le C ni le C++ ne fournissent une fonction strictement définie qui vous permettrait d'attribuer une adresse physique spécifique à un pointeur. Ainsi, votre question sur "comment assigner 0 adresse à un pointeur" est formellement sans réponse. Vous ne pouvez tout simplement pas attribuer une adresse spécifique à un pointeur en C/C++. Cependant, dans le domaine des fonctionnalités définies par l'implémentation, la conversion explicite d'entier en pointeur est destinée à avoir cet effet. Donc, vous le feriez comme suit
uintptr_t address = 0;
void *p = (void *) address;
Notez que ce n'est pas la même chose que de faire
void *p = 0;
Cette dernière produit toujours la valeur null-pointer, alors que la première ne le fait pas dans le cas général. La première produira normalement un pointeur à l'adresse physique 0
qui peut ou non être la valeur du pointeur nul sur la plate-forme donnée.