O que significa (int *) p?


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!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *