Quelle est la taille d’un pointeur?

La taille d’un pointeur est-elle la même que celle du type sur lequel il pointe, ou les pointeurs ont-ils toujours une taille fixe? Par exemple…

int x = 10; int * xPtr = &x; char y = 'a'; char * yPtr = &y; std::cout << sizeof(x) << "\n"; std::cout << sizeof(xPtr) << "\n"; std::cout << sizeof(y) << "\n"; std::cout << sizeof(yPtr) << "\n"; 

Quel serait le résultat de cela? Est-ce que sizeof(xPtr) renverrait 4 et sizeof(yPtr) renverraient 1 ou les 2 pointeurs retourneraient-ils réellement la même taille? La raison pour laquelle je pose cette question est que les pointeurs stockent une adresse mémoire et non les valeurs de leurs adresses stockées respectives.

Les pointeurs ont généralement une taille fixe, par ex. sur un exécutable 32 bits, ils sont généralement 32 bits. Il y a quelques exceptions, comme sur les anciennes fenêtres 16 bits lorsque vous deviez faire la distinction entre les pointeurs 32 bits et 16 bits … Il est généralement assez sûr de supposer qu’ils seront uniformes dans un exécutable donné sur les systèmes d’exploitation modernes. .

Edit: Malgré tout, je vous déconseille fortement de faire cette hypothèse dans votre code . Si vous voulez écrire quelque chose qui doit absolument avoir un pointeur d’une certaine taille, vous feriez mieux de le vérifier!

Les pointeurs de fonction sont une autre histoire – voir la réponse de Jens pour plus d’informations.

Les pointeurs de fonction peuvent avoir des tailles très différentes , de 4 à 20 octets sur une machine X86, en fonction du compilateur. Donc, la réponse est NON – les tailles peuvent varier.

Autre exemple: prenez un programme 8051, il a trois plages de mémoire et a donc trois tailles de pointeur différentes, de 8 bits, 16 bits, 24 bits, en fonction de l’emplacement de la cible, même si la taille de la cible est toujours la même .

Sur la machine 32 bits, le pointeur sizeof est de 32 bits (4 octets), tandis que sur la machine 64 bits, il est de 8 octets. Quel que soit le type de données sur lequel ils pointent, ils ont une taille fixe.

Les pointeurs ne sont pas toujours de la même taille sur la même architecture.

Vous pouvez en savoir plus sur le concept de pointeurs “proches”, “lointains” et “énormes”, comme exemple de cas où les tailles de pointeurs diffèrent …

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

Pour répondre à votre autre question. La taille d’un pointeur et la taille de ce qu’il pointe ne sont pas liées. Une bonne analogie est de les considérer comme des adresses postales. La taille de l’adresse d’une maison n’a aucun rapport avec la taille de la maison.

Ils peuvent être différents sur les machines adressables par mot (par exemple, les systèmes PVP Cray).

Aujourd’hui, la plupart des ordinateurs sont des machines adressables en octets, où chaque adresse fait référence à un octet de mémoire. Là, tous les pointeurs de données ont généralement la même taille, à savoir la taille d’une adresse de machine.

Sur les machines adressables par mot, chaque adresse de machine se réfère plutôt à un mot plus grand qu’un octet. Sur ceux-ci, un pointeur (char *) ou (void *) sur un octet de mémoire doit contenir à la fois une adresse de mot et un décalage d’octet dans le mot addresed.

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

La taille d’un pointeur est la taille requirejse par votre système pour contenir une adresse mémoire unique (car un pointeur contient simplement l’adresse vers laquelle il pointe)