web-dev-qa-db-fra.com

Quelle est la taille d'un pointeur?

La taille d'un pointeur est-elle identique à 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";

Quelle serait la sortie de ceci? Est-ce que sizeof(xPtr) renverrait 4 et sizeof(yPtr) renverrait 1, ou les 2 pointeurs renverraient-ils 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 respectives.

54
MGZero

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 existe quelques exceptions, comme sur les anciennes fenêtres 16 bits où il fallait distinguer entre les pointeurs 32 bits et 16 bits ... Il est généralement prudent de supposer qu'ils seront uniformes dans un exécutable donné sur un système d'exploitation moderne .

Edit: Même dans ce cas, je vous déconseille vivement de faire cette hypothèse dans votre code . Si vous écrivez quelque chose qui doit absolument avoir des indicateurs d'une certaine taille, vous feriez mieux de le vérifier!

Les pointeurs de fonction sont une histoire différente - voir réponse de Jens pour plus d'informations.

69
Nathan Monteleone

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

Autre exemple: prenons un programme 8051, il a trois plages de mémoire et 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 (par exemple, char) .

70
Jens

Sur une machine 32 bits, le pointeur sizeof est de 32 bits (4 octets), alors que sur une machine 64 bits, il est de 8 octets. Indépendamment du type de données vers lequel ils pointent, ils ont une taille fixe.

15
peeyush

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.

8
Jay

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", juste à titre d'exemple d'un cas où la taille des pointeurs diffère ...

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

8
Soumajyoti

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

De nos jours, la plupart des ordinateurs sont des machines adressables sur des octets, chaque adresse faisant 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 à Word, chaque adresse de machine fait référence à 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 Word et un décalage d'octet dans le mot ajouté.

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

2
Markus Kuhn

La taille d'un pointeur est la taille requise par votre système pour contenir une adresse mémoire unique (puisqu'un pointeur ne contient que l'adresse vers laquelle il pointe)

0
J T