¿El tamaño de los punteros varía en C?

Posibles duplicados:
¿Puede el tamaño de los indicadores variar según lo que se indique?
¿Hay alguna plataforma donde los punteros a diferentes tipos tengan diferentes tamaños?

¿Es posible que el tamaño de un puntero a un flotador en c difiera de un puntero a int? Después de haberlo probado, obtengo el mismo resultado para todo tipo de punteros.

#include  #include  int main() { printf("sizeof(int*): %i\n", sizeof(int*)); printf("sizeof(float*): %i\n", sizeof(float*)); printf("sizeof(void*): %i\n", sizeof(void*)); return 0; } 

Que salidas aquí (OSX 10.6 64bit)

 sizeof(int*): 8 sizeof(float*): 8 sizeof(void*): 8 

¿Puedo suponer que los punteros de diferentes tipos tienen el mismo tamaño (en un arco, por supuesto)?

Los punteros no son siempre del mismo tamaño en el mismo arco.

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

En los viejos tiempos, usando, por ejemplo, los comstackdores de Borland C en la plataforma DOS, había un total de (creo) 5 modelos de memoria que incluso podían mezclarse hasta cierto punto. Esencialmente, tenía una opción de punteros pequeños o grandes para datos, y punteros pequeños o grandes para codificar, y un modelo “pequeño” donde el código y los datos tenían un espacio de direcciones común de (si no recuerdo mal) 64K.

Fue posible especificar punteros “enormes” dentro de un progtwig que de otro modo se construyó en el modelo “pequeño”. ¡Entonces, en el peor de los casos , era posible tener punteros de diferentes tamaños para el mismo tipo de datos en el mismo progtwig!

Creo que el estándar ni siquiera lo prohíbe, por lo que teóricamente un oscuro comstackdor de C podría hacer esto incluso hoy. Pero sin duda hay expertos que podrán confirmarlo o corregirlo.

Los punteros a los datos siempre deben ser compatibles con el void* por lo que, en general, se realizarían hoy en día como tipos del mismo ancho.

Esta afirmación no es verdadera para los punteros de función, pueden tener diferente ancho. Por esa razón, en C99, los punteros a la función de conversión a void* no están definidos.

Según entiendo, no hay nada en el estándar C que garantice que los punteros a diferentes tipos tengan el mismo tamaño, por lo que, en teoría, un int * y un float * en la misma plataforma podrían tener diferentes tamaños sin romper ninguna regla.

Existe el requisito de que char * y void * tengan los mismos requisitos de representación y alineación, y existen otros requisitos similares para diferentes subconjuntos de tipos de punteros, pero no hay nada que abarque todo.

En la práctica, es poco probable que se encuentre con una implementación que use punteros de diferentes tamaños a menos que se dirija a lugares bastante oscuros.

Sí, el tamaño de un puntero depende de la plataforma. Más específicamente, el tamaño de un puntero depende de la architecture del procesador de destino y del “bit-ness” para el que comstack.

Como regla general, en una máquina de 64 bits, un puntero suele ser de 64 bits, en una máquina de 32 bits, generalmente de 32 bits. Sin embargo, hay excepciones.

Como un puntero es solo una dirección de memoria, siempre tiene el mismo tamaño independientemente de la memoria que señale. Por lo tanto, un puntero a un flotante, un char o un int son todos del mismo tamaño.

Sí. No es común, pero esto sin duda ocurriría en sistemas que no son direccionables por byte. Por ejemplo, un sistema de 16 bits con 64 Kword = 128 KB de memoria. En tales sistemas, aún puede tener punteros int de 16 bits. Pero un puntero de char para un char de 8 bits necesitaría un bit adicional para indicar highbyte / lowbyte dentro de la palabra, y por lo tanto tendría punteros de 17/32 bits.

Esto puede sonar exótico, pero muchos DSP gastan el 99.x% del tiempo ejecutando código numérico especializado. Un DSP de sonido puede ser un poco más simple si todo lo que tiene que tratar es datos de 16 bits, dejando el matemático ocasional de 8 bits para ser emulado por el comstackdor.

Iba a escribir una respuesta diciendo que C99 tiene varios requisitos de conversión de puntero que aseguran más o menos que los punteros a los datos tengan que ser todos del mismo tamaño. Sin embargo, al leerlos cuidadosamente, me di cuenta de que C99 está específicamente diseñado para permitir que los punteros sean de diferentes tamaños para diferentes tipos.

Por ejemplo, en una architecture donde los enteros son 4 bytes y deben estar alineados a 4 bytes, un puntero int podría ser dos bits más pequeño que un puntero char o void. Siempre que el elenco haga el cambio en ambas direcciones, está bien con C99. Es útil decir que el resultado de convertir un puntero a un puntero int alineado incorrectamente no está definido.

Ver el estándar C99 . Sección 6.3.2.3

¿Puedo suponer que los punteros de diferentes tipos tienen el mismo tamaño (en un arco, por supuesto)?

Para las plataformas con modelo de memoria plana (== todas las plataformas populares / modernas), el tamaño del puntero sería el mismo.

Para las plataformas con modelo de memoria segmentada, para la eficiencia, a menudo hay tipos de puntero específicos de la plataforma de diferentes tamaños. (Por ejemplo, los indicadores far en el DOS, ya que la CPU 8086 usaba el modelo de memoria segmentada). Pero esto es específico de la plataforma y no es estándar.

Probablemente deberías tener en cuenta que en C ++ el tamaño del puntero normal puede diferir del tamaño del puntero al método virtual. Los punteros a los métodos virtuales tienen que preservar un poco de información adicional para que no funcione correctamente con el polymorphism. Esta es probablemente la única excepción que conozco, que sigue siendo relevante (ya que dudo que el modelo de memoria segmentada alguna vez lo recupere).