Leyendo el bootloader de FreeBSD, vi en el código:
struct gen_fb {
uint64_t fb_addr;
uint64_t fb_size;
uint32_t fb_height;
uint32_t fb_width;
uint32_t fb_stride;
uint32_t fb_mask_red;
uint32_t fb_mask_green;
uint32_t fb_mask_blue;
uint32_t fb_mask_reserved;
uint32_t fb_bpp;
};
El miembro fb_addr es dónde guarda la dirección de memoria a la memoria de video.
En un uint64_t, no un puntero, guardado en algo así como un unsigned long int.
Por lo que me entro la duda, y lo probe:
#include <stdio.h>
#include <stdint.h>
int main()
{
int numero = 64;
const uint64_t int_addr = (uint64_t)№
int *ptr_num = (int*)int_addr;
printf("%d %d %p %p %p %d\n",numero,*ptr_num,int_addr,ptr_num,&numero,*((int*)int_addr));
return 0;
}
Cómo se puede ver, parace una forma “segura” de guardar un puntero, y que no cambie por error.