Se você quer escrever código que modifica diretamente a memória da máquina, vai ter que entender ponteiros. Eles não são um tipo especial - são apenas variáveis que armazenam endereços de memória. Mas com isso, você pode acessar, modificar ou interpretar qualquer região de memória do processo. Literalmente.
O que é um ponteiro?
int x =10;int*px =&x;
x é uma variável com um valor (10).
&x é o endereço de memória onde x está guardado.
px é um ponteiro para inteiro, ou seja, ele guarda o endereço de x.
Você pode acessar o valor apontado com o operador de desreferência:
printf("%d\n",*px);// imprime 10
Ponteiros são números
Ponteiros são representados como endereços inteiros, normalmente de 4 bytes (32 bits) ou 8 bytes (64 bits), dependendo da arquitetura. São exibidos em hexadecimal:
printf("%p\n",(void*)px);// Ex: 0x7ffeebf5a4cc
Isso é o que permite aritmética de ponteiros, interpretação de dados arbitrários, e técnicas como type punning, casting bruto ou exploração de estruturas de dados.