Melhor resposta
(int *) p é uma conversão de tipo explícita para o valor armazenado na variável p, para o tipo de um ponteiro cujo endereço aponta para um inteiro. O valor que p armazena é um endereço de memória do primeiro byte dos 4 que são usados para armazenar o referido inteiro de 32 bits (4 bytes).
Um ponteiro armazena um número que deve ser o endereço de um local específico na memória (Heap ou Stack). O tipo de dados armazenados nesse local pode ser qualquer coisa , e nesta expressão, estamos especificando (ou melhor, assumindo) que é um número inteiro de 4 bytes.
O valor de p pode ser especificado antes de ser atribuído a outro ponteiro –
int *c = (int *) p;
Ou poderia ser desreferenciado para recuperar o valor armazenado no endereço mantido por p como tal –
int c = *((int *) p);
Ou se p realmente for um ponteiro, ele poderia ser referenciado sem ele sendo explicitamente especificado porque sabemos que o valor armazenado nele é um número inteiro de 4 bytes.
Para simplificar, não verifiquei os ponteiros. É muito importante que você verifique se um ponteiro é nulo, porque desreferenciar um ponteiro nulo resulta em uma falha.
Exemplo de um nulo check –
if (p != null)
printf(“int is ‘\%d’”, *p);
Agora, assumindo o endereço está correto e que o ponteiro não é nulo, e que o tipo de dados armazenado no local da memória é na verdade um número inteiro, seu console irá imprimi-lo corretamente .
Aqui está um artigo detalhado e bem explicado que encontrei há alguns anos, sobre como ler ponteiros em c – Regra horária / espiral
Resposta
Para entender o que (int *) está fazendo lá, é útil entender o que malloc (sizeof (int)) está fazendo. “s decompô-lo da direita para a esquerda.
Primeiro, temos um sizeof (int). Este é um valor que representa o número de bytes necessários para representar um inteiro na memória. Este pode ser 4 ou algum outro número, dependendo do computador em que estamos programando.
Portanto, a função malloc () está realmente obtendo um parâmetro como 4, a la malloc (4). Esta função pergunta ao Biblioteca C para ir para algum lugar na memória e reservar 4 bytes (que por acaso têm o tamanho exato para conter um inteiro).
Agora, a função malloc sempre retorna o endereço daquela memória. Lembre-se daquele computador a memória é disposta em série e cada endereço na memória é único. Agora malloc () não é uma função muito inteligente – você diz a quantidade de memória que deseja e ela diz “aqui está”. Não sabe o que você deseja colocar nessa memória – ele só sabe quanta memória você pediu.
Como malloc () não sabe o que você deseja colocar nessa memória, ele retorna um tipo chamado (void *), ou seja, um endereço de memória arbitrário, também conhecido como ponteiro. Na maioria dos computadores modernos, um endereço é um valor de 64 bits, que pode ser representado em 8 bytes de memória – mas os computadores são diferentes r, e computadores diferentes podem retornar tamanhos diferentes. Assim, malloc () pode retornar 8 bytes de dados, no formato (void *).
Por último, precisamos entrar naquela memória que malloc () nos deu, para que possamos tratá-la como contendo um inteiro. Como fazemos isso? malloc () apenas nos deu um ponteiro para alguma memória em algum lugar no espaço. Fazemos isso dizendo ao compilador que o endereço de memória que recebemos de malloc () é realmente o endereço de um inteiro. Portanto, seu (int *).
Agora que você passou por tudo isso, o compilador entende totalmente o que você queria, porque você se deu ao trabalho de descrever cada etapa: você quer um arquivo de oito bytes endereço apontando para uma localização de quatro bytes na memória, que por sua vez contém um número inteiro.
E é isso que toda a expressão significa!