sirven sencillos que punteros puntero para operaciones los ejemplos ejemplo dev declaracion con cadenas apuntadores c pointers

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



punteros c++ pdf (11)

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 <stdio.h> #include <stdlib.h> 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)?


¿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 polimorfismo. 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).


El puntero es una dirección de memoria, y por lo tanto debería ser el mismo en una máquina específica. Máquina de 32 bits => 4 Bytes, 64 bit => 8 Bytes.

Por lo tanto, independientemente del tipo de datos a los que apunte el puntero, el tamaño de un puntero en una máquina específica sería el mismo (ya que el espacio requerido para almacenar una dirección de memoria sería el mismo).

Asunción: estoy hablando de indicadores cercanos a los valores de datos, del tipo que usted declaró en su pregunta.


En los viejos tiempos, usando, por ejemplo, los compiladores 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 programa 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 programa!

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


Hay plataformas donde los punteros de función son de un tamaño diferente al de otros punteros.

Nunca he visto más variación que esta. El resto de los punteros deben ser como máximo sizeof (void *) ya que el estándar requiere que se puedan convertir a void * sin pérdida de información.


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 arquitectura 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


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.



Los punteros siempre tienen el mismo tamaño en el mismo arco, independientemente del tipo de datos al que apunta. De lo contrario, elementos como el fundido entre diferentes tipos de punteros serán inútiles y romperán muchas cosas.

Muchas técnicas de codificación comunes dependen de la conversión entre, por ejemplo, un puntero vacío (o un char) a varias estructuras, dependiendo del tamaño.

Tome incluso el printf () estándar, debe ser capaz de tomar punteros a varios tipos de datos. Si los punteros eran de diferente tamaño, implementar printf podría ser muy complicado.


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

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 compilador.


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.