Todos os pointers de dados são do mesmo tamanho em uma plataforma para todos os tipos de dados?

São char* , int* , long* ou long long* do mesmo tamanho (em uma determinada plataforma)?

Eles não são garantidos para ser do mesmo tamanho, embora nas plataformas que tenho experiência com eles geralmente são.

C draft on-line de 2011:

6.2.5 Tipos

28 Um ponteiro para void deve ter os mesmos requisitos de representação e alinhamento que um ponteiro para um tipo de caractere. 48) Da mesma forma, pointers para versões qualificadas ou não qualificadas de tipos compatíveis devem ter os mesmos requisitos de representação e alinhamento. Todos os pointers para os tipos de estrutura devem ter os mesmos requisitos de representação e alinhamento que os outros. Todos os pointers para tipos de união devem ter os mesmos requisitos de representação e alinhamento um do outro. Ponteiros para outros tipos não precisam ter a mesma representação ou requisitos de alinhamento.


48) Os mesmos requisitos de representação e alinhamento devem implicar a intercambialidade como argumentos para funções, valores de retorno de funções e membros de sindicatos.

Não necessariamente. O padrão não garante sizeof(double*) == sizeof(int*) . Por exemplo, suponha que um processador com dois barramentos de endereços com diferentes larguras (como em alguns processadores de arquitetura de Harvard) poderia ter pointers com tamanhos diferentes.

Em processadores incorporados de 16 bits que possuem RAM (paginada) e / ou flash bancados, o uso de páginas pode levar a que os pointers tenham tamanhos diferentes – embora isso seja independente do tamanho dos dados para os quais eles apontam.

Por exemplo, no processador HCS12 da Freescale que possui flash banked, os pointers de dados são todos de 16 bits.

No entanto, os pointers de function são 16 bits para pointers próximos (para código na mesma página que a function de chamada ou em flash sem banco), ou 24 bits para pointers distantes (para código em uma página diferente), incorporando o número da página no endereço .

As coisas são complicadas se você quiser armazenar dados constantes no flash paginado, pois devido à limitação no tamanho do ponteiro de dados, a function que usa os dados deve estar na mesma página que os dados que estão sendo acessados.

É concebível que um processador de 16 bits com RAM armazenada também tenha tamanhos diferentes para pointers de dados próximos e distantes.

Observe o que o padrão C diz – conforme citado por John Bode. Note, também, que o padrão C não diz nada sobre os tamanhos dos pointers para as funções.

O padrão POSIX estabelece alguns requisitos extras:

2.12.3 Tipos de Ponteiro

Todos os tipos de ponteiro de function devem ter a mesma representação que o ponteiro de tipo para anular. A conversão de um ponteiro de function para void * não deve alterar a representação. Um valor void * resultante de tal conversão pode ser convertido de volta para o tipo de ponteiro de function original, usando uma conversão explícita, sem perda de informação.

Nota: O padrão ISO C não exige isso, mas é necessário para conformidade com POSIX.

Não existe tal garantia nos padrões ISO C ou C ++, mas na prática, eu ainda não vi uma plataforma onde isso não seja válido.

Observe que, independentemente disso, reinterpret_cast ’em um ponteiro para outro, na maioria das vezes, levará ao UB, com algumas exceções ( void* e unsigned char* para PODs). Então, qualquer truque de união. Então a pergunta óbvia é: por que você se importaria?

Ao programar o modo real x86 com o Watcom C, você pode ter um modelo de memory mista usando pointers próximos de 16 bits e pointers de 32 bits.

Nos dias do DOS em modo protegido, um ponteiro de function e um ponteiro de dados podem ter tamanhos diferentes porque os dados podem estar em uma seção diferente.

Geralmente sim, todos os pointers para qualquer coisa, se eles apontam para um int ou um longo ou uma seqüência de caracteres ou uma matriz de seqüências de caracteres ou uma function, apontam para um endereço de memory único, que é o mesmo tamanho em uma máquina. Isso ocorre porque o Processador em uma máquina possui um registro de endereço no qual esses pointers são carregados e o tamanho desse registro de endereço controla o tamanho dos pointers.

A única exceção pode estar em casos como máquinas antigas Intel 8088 de 16 bits em que havia um processo de duas etapas para determinar o endereço de memory, envolvendo um ponteiro de segmento de 16 bits (que identificou um bloco de memory de 64K no espaço de endereço de 1MByte) e, em seguida, um segundo endereço de memory de 16 bits para identificar o endereço de memory específico nesse segmento. Esses dois endereços de 16 bits foram então combinados para obter o endereço de memory completo de 20 bits. Nesse cenário, então, imagino que seja possível distinguir entre os endereços individuais de 16 bits e o endereço combinado de 20 bits.