¿Cuál es el tamaño de un puntero?

¿El tamaño de un puntero es el mismo que el tipo al que apunta, o los punteros siempre tienen un tamaño fijo? Por ejemplo…

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"; 

¿Cuál sería la salida de esto? ¿ sizeof(xPtr) devolvería 4 y sizeof(yPtr) devolvería 1, o los 2 punteros realmente devolverían el mismo tamaño? La razón por la que pregunto esto es porque los punteros almacenan una dirección de memoria y no los valores de sus respectivas direcciones almacenadas.

Los punteros generalmente tienen un tamaño fijo, por ej. en un ejecutable de 32 bits generalmente son de 32 bits. Hay algunas excepciones, como en las viejas ventanas de 16 bits cuando se tenía que distinguir entre punteros de 32 bits y 16 bits … Por lo general, es bastante seguro suponer que van a ser uniformes dentro de un ejecutable dado en los sistemas operativos de escritorio modernos. .

Editar: Aun así, yo recomendaría encarecidamente no hacer esta suposición en tu código . Si va a escribir algo que tiene que tener un puntero de cierto tamaño, ¡será mejor que lo compruebe!

Los indicadores de función son una historia diferente: consulte la respuesta de Jens para obtener más información.

Los punteros de función pueden tener tamaños muy diferentes , de 4 a 20 bytes en una máquina X86, según el comstackdor. Entonces la respuesta es NO – los tamaños pueden variar.

Otro ejemplo: tomar un progtwig 8051, tiene tres rangos de memoria y por lo tanto tiene tres tamaños de puntero diferentes, de 8 bits, 16 bits, 24 bits, dependiendo de dónde se encuentre el objective, aunque el tamaño del objective sea siempre el mismo (por ejemplo, char) .

En el tamaño de la máquina de 32 bits, el puntero es de 32 bits (4 bytes), mientras que en la máquina de 64 bits es de 8 bytes. Independientemente del tipo de datos al que apuntan, tienen un tamaño fijo.

Los punteros no son siempre del mismo tamaño en la misma architecture.

Puede leer más sobre el concepto de punteros “cercanos”, “lejanos” y “grandes”, como un ejemplo de caso en que los tamaños de los punteros difieren …

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

Para responder a tu otra pregunta. El tamaño de un puntero y el tamaño de lo que apunta no están relacionados. Una buena analogía es considerarlos como direcciones postales. El tamaño de la dirección de una casa no tiene relación con el tamaño de la casa.

Pueden ser diferentes en máquinas direccionables por palabras (p. Ej., Sistemas Cray PVP).

La mayoría de las computadoras hoy en día son máquinas direccionables por byte, donde cada dirección se refiere a un byte de memoria. Allí, todos los punteros de datos suelen tener el mismo tamaño, es decir, el tamaño de una dirección de máquina.

En máquinas direccionables por palabras, cada dirección de máquina se refiere en cambio a una palabra más grande que un byte. En estos, un puntero (char *) o (void *) a un byte de memoria debe contener una dirección de palabra más un desplazamiento de bytes dentro de la palabra direccionada.

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

El tamaño de un puntero es el tamaño requerido por su sistema para mantener una dirección de memoria única (ya que un puntero solo contiene la dirección a la que apunta)