que punteros puntero operaciones ejemplos declaracion con cadenas aritmetica c pointers

operaciones - ¿El tamaño de los punteros puede variar entre datos y punteros de función?



punteros en c ejemplos (6)

En el modo real x86, se accede al código y los datos por segmento + desplazamiento, cada uno de ellos en una cantidad de 16 bits. Los punteros "cercanos" eran solo de 16 bits y utilizaban el segmento actual, los punteros "lejanos" eran de 32 bits y especificaban el segmento y el desplazamiento. Para los compiladores de C, había varios modelos de memoria diferentes que podía elegir, con diferentes valores predeterminados de punteros cercanos o lejanos para el código y los datos.

Por ejemplo, el modelo de memoria "Medio" usaba los punteros cerca de los datos pero los punteros lejanos para el código por defecto.

No me sorprendería si algunos procesadores integrados modernos tuvieran modelos de memoria similares.

Acabo de leer la sección de C Preguntas frecuentes sobre punteros .

Discute que no se pueden utilizar los punteros void * para mantener los punteros de función porque los punteros a datos y las punteras a funciones pueden tener diferentes tamaños en algunas plataformas y solo se garantiza que void * sea ​​lo suficientemente grande como para contener punteros a datos.

¿Alguien puede dar un ejemplo de una plataforma donde los punteros a datos y los punteros a funciones realmente tengan diferentes tamaños?


Es una situación "depende". En C ++, recuerdo que los punteros de función miembro son en realidad dos punteros de tamaño, pero eso puede ser simplemente un detalle de implementación.

En algunos de los sistemas anteriores a PC realmente antiguos, también podría tener un tamaño de puntero dependiendo de lo que se hacía referencia (pero también podría tener caracteres de 11 bits: D)


Las máquinas que utilizan una arquitectura de Harvard tienen un almacenamiento separado para las instrucciones y los datos y, en consecuencia, tienen espacios de direcciones separados para las instrucciones y los datos. En tal arquitectura, no hay ninguna razón real para que los dos espacios de direcciones (o la memoria física que los respaldan) tengan el mismo tamaño.


Los microcontroladores PIC de 16 bits (Microchip PIC24 y dsPIC) son ejemplos de dispositivos de arquitectura Harvard con diferentes datos y tamaños de punteros de espacio de código. Los espacios de direcciones independientes difieren en tamaño: en el chip SRAM tiene un mayor costo de área de chip que la memoria Flash, hay mucho menos, por lo que los punteros de datos pueden ser más pequeños.

Esto también se aplica a las arquitecturas PIC12, PIC16 y PIC18 también, pero dsPIC es lo que estoy usando actualmente.


Tenga en cuenta que POSIX requiere que los punteros a los objetos y los punteros a las funciones sean del mismo tamaño:

2.12.3 Tipos de punteros

Todos los tipos de punteros de función tendrán la misma representación que el puntero de tipo para anular. La conversión de un puntero de función a void * no alterará la representación. Un valor nulo * resultante de dicha conversión se puede convertir de nuevo al tipo de puntero de función original, utilizando una conversión explícita, sin pérdida de información.

Nota: El estándar ISO C no requiere esto, pero es necesario para la conformidad con POSIX.

En consecuencia, los sistemas que reclaman el cumplimiento con POSIX serán uniformes. Si solo apunta a esas máquinas, entonces no tiene que preocuparse por las diferencias.


> type ppp.c #include <stdio.h> #include <stdlib.h> int global = 0; int main(void) { int local = 0; static int staticint = 0; int *mall; int (*fx)(void); fx = main; mall = malloc(42); /* assume it worked */ printf("#sizeof pointer to local: %d/n", (int)sizeof &local); printf("#sizeof pointer to static: %d/n", (int)sizeof &staticint); printf("#sizeof pointer to malloc''d: %d/n", (int)sizeof mall); printf("#sizeof pointer to global: %d/n", (int)sizeof &global); printf("#sizeof pointer to main(): %d/n", (int)sizeof fx); free(mall); return 0; } > tcc -mc ppp.c Turbo C Version 2.01 ... warnings about unused variables elided ... Turbo Link Version 2.0 ... > ppp #sizeof pointer to local: 4 #sizeof pointer to static: 4 #sizeof pointer to malloc''d: 4 #sizeof pointer to global: 4 #sizeof pointer to main(): 2 > tcc -mm ppp.c > ppp #sizeof pointer to local: 2 #sizeof pointer to static: 2 #sizeof pointer to malloc''d: 2 #sizeof pointer to global: 2 #sizeof pointer to main(): 4

tcc -mc genera código en el modelo "compacto"; tcc -mm genera código en el modelo "medio"