Ir ao conteúdo
  • Cadastre-se

C Sobre Cast - Linguagem C


Posts recomendados

int inteiro;
inteiro = (float*)inteiro;

Eu entendi que o cast sem aquele asterisco, mascara uma variavel naquela linha. Eu não entendi é esse asterisco, pois, acho que ele não é um ponteiro, já que ele esta depois de float e não antes. Então não sei o que é isso nem pra que serve.

Um exemplo pratico que vejo é quando colocamos um ponteiro pra apontar pra "area do malloc":

 

int *pt;
pt = (int*)malloc...

eu sei que é desnecessario o cast antes do malloc mas vamos fingir que é necessário nessa questao.

Link para o comentário
Compartilhar em outros sites

Boa noite,

 

 

15 horas atrás, JaoProgramador disse:

int *pt; pt = (int*)malloc...

eu sei que é desnecessario o cast antes do malloc mas vamos fingir que é necessário nessa questao.

 

O motivo real de ser assim é por causa da sintaxe da linguagem historicamente aceita, hoje é semântico ou de significado. Um ponteiro do tipo void é um ponteiro indefinido. Um ponteiro do tipo inteiro é um objeto com aritmética própria para indexação da memória em saltos na largura de um inteiro então se atribuições consistentes são entre tipos de dados iguais é, quando explicitamente, conveniente para todos a coerção de tipo.

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, JaoProgramador disse:

int inteiro;
inteiro = (float*)inteiro;

 

 

Isso não faz sentido. O que estaria tentando fazer aqui? Converter um valor inteiro para um ponteiro e armazenar o endereço de memória em uma variável inteira?

 

 

1 hora atrás, JaoProgramador disse:

Eu entendi que o cast sem aquele asterisco, mascara uma variavel naquela linha. Eu não entendi é esse asterisco, pois, acho que ele não é um ponteiro, já que ele esta depois de float e não antes. Então não sei o que é isso nem pra que serve.

 

(float *) é um cast para converter um endereço de memória que aponta para valores de outro tipo, em um endereço de memória que aponta para valores float.

 

Ou seja, ao dar cast de um endereço de memória usando (float *) basicamente está dizendo: Transforme o endereço de memória a seguir em um endereço de memória que quando for desreferenciado (com o operador *) o valor para o qual o ponteiro aponta seja interpretado como um número do tipo float.

 

 

1 hora atrás, JaoProgramador disse:

Um exemplo pratico que vejo é quando colocamos um ponteiro pra apontar pra "area do malloc":

 


int *pt;
pt = (int*)malloc...

eu sei que é desnecessario o cast antes do malloc mas vamos fingir que é necessário nessa questao.

 

malloc retorna um ponteiro do tipo void * , em C esse tipo de ponteiro pode ser automaticamente convertido para qualquer outro tipo automaticamente, na verdade possibilitar conversão automática para outro ponteiro é o motivo pelo qual ele existe, logo dar cast no malloc em C é besteira (isso pode até atrapalhar pois tem situações que gerariam warning durante a compilação te avisando que existe algo errado, mas que não vão ser detectados se você tiver usado cast no retorno de malloc).

 

 

Link para o comentário
Compartilhar em outros sites

10 horas atrás, isrnick disse:

(float *) é um cast para converter um endereço de memória que aponta para valores de outro tipo, em um endereço de memória que aponta para valores float.

 

Deixa eu ver se entendi:

 

<int y=9;

  (Float) y/2; // isso faz y virar float,       momentaneamente.

(Float*) y/2 // iSso faz y virar float, momentaneamente.

Acho que na prática é o mesmo efeito?

você consegue me dar um exemplo q eles tem diferenca?

 

>

adicionado 5 minutos depois

A minha duvida é em relação a posição do asterisco, por exemplo:

int vari*;

ou
(int*)malloc...

Isso é novo pra mim. Isso é um ponteiro? É um cast? Não entendi. 

Já isso:

int *vari;

Eu entendo.

 

Resumindo a duvida esta no asterisco. estar posicionado atras ou na frente.

  • Confuso 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, JaoProgramador disse:

Deixa eu ver se entendi:

 

int y=9;

  (Float) y/2; // isso faz y virar float,       momentaneamente.

(Float*) y/2 // iSso faz y virar float, momentaneamente.

Acho que na prática é o mesmo efeito?

você consegue me dar um exemplo q eles tem diferenca?

 

Não, não tem o mesmo efeito, o segundo nem pode ser feito.

 

 

2 horas atrás, JaoProgramador disse:

int vari*;

 

Esse asterisco está no lugar errado, e provavelmente geraria erro.

 

Um ponteiro é declarado assim:

int *vari;

 

E o seu problema parece ser que você ainda não aprendeu o que são ponteiros e como usá-los.

 

Tentar dar uma explicação completa sobre ponteiros em C aqui no fórum seria complicado, mas você deve achar explicações pesquisando online. Então vou apenas passar alguns conceitos básicos.

 

Um ponteiro é um tipo de variável que serve apenas para armazenar endereços de memória, e dizemos que "um ponteiro aponta para o local do endereço de memória guardado nele".

 

Para obter o endereço de memória de uma variável usamos o operador & (operador "endereço de") antes do nome da variável, e então esse endereço pode ser guardado num ponteiro.

int a = 10;
int *ponteiro;
ponterio = &a;

Note que você já usa o operador & frequentemente na função scanf, ou seja você está passando o endereço da variável para a função scanf, e na função esse endereço é guardado num ponteiro.

 

Uma vez que o ponteiro aponta para um local da memória podemos usar o operador * (operador de indireção ou operador de desreferenciamento) para acessar o valor do local para onde o ponteiro aponta. Então no exemplo acima acessar o local fazendo *ponteiro vai retornar o valor guardado na variável a, ou seja 10, e se alterar o valor deste local da memória fazendo uma atribuição como *ponteiro = 5; vai alterar o valor da variável a para 5 pois esse lugar da memória é onde é guardado o valor de a.

 

Então numa função como scanf, ela pode alterar dentro da função o valor do local do endereço de memória da variável que foi passado para ela, e quando sair da função esta variável vai estar com o novo valor.

 

 

O tipo do ponteiro indica como os dados guardados no local da memória para onde ele aponta devem ser interpretados, e também qual o tamanho em bytes deste tipo de dado, afinal na memória tanto um valor int quanto um float (ou qualquer outro tipo de dado) são guardados como agrupamentos (bytes) de 0s e 1s indicando estado binário de 1 bit da memória (1 byte = 8bits).

 

Um cast como (float *) serve para converter um endereço de memória de outro tipo em um endereço de memória do tipo float. E esse tipo de cast só deve ser usado para converter endereços de memória.

 

 

Você tem que usar esse botão  para postar códigos no fórum:

image.png.d2f5b07ebb38fee82acb27fc88e0de00.png

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!