Ir ao conteúdo
  • Cadastre-se
Luan Farias

RESOLVIDO Dúvida quanto a declaração de ponteiros em C

Recommended Posts

Boa noite, pessoal.

 

Sou aluno do curso de ciência da computação e tenho uma dúvida quanto a declaração de ponteiros:

 

- Desde do inicio foi ensinado que a declaração de um ponteiro é da seguinte maneira:

TIPO *nome_da_variavel;

 

Sendo que cheguei em Estrutura de Dados e a declaração de um ponteiro que encontrei tanto na apostila do professor quanto na internet foi da seguinte maneira: 

TIPO* nome_da_variavel;

 

A pergunta é, qual a diferença entre botar o asterisco (*), no tipo e na variável?

 

Notei que há diferença quando estava fazendo um exercício de Lista Sequencial. Fiz uma função "CriarLista". onde retorna um ponteiro "li" do tipo "LISTA", criado por mim.

 

Se eu declarar a função assim: LISTA CriarLista ( ) e retornar o ponteiro li, dá erro, o xCode diz que tenho que retornar *li.

Caso eu declarar a função assim: LISTA* CriarLista( ) e retornar li, dá certo.

 

Abaixo segue o código:

http://pastebin.com/1QuRaiVR

 

Espero que vocês me ajudem, pois o único lugar que tive ajuda foi através desse link mas também não ajudou em muita coisa. : http://www.ime.usp.br/~pf/algoritmos/aulas/footnotes/pointer-decl.html

 

Desde já obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não há diferença nenhuma quanto a posição do asterisco no momento da declaração da variável.

O compilador vai analisar o teu código descartando todos os espaços em branco, comentários, trocas de linha, tabs, etc.

Então:

1) int* x;

2) int *x;

3) int*x;

4) int

*

x

;

5) int* /* ola amiguinho */ x /* eu sou o dolinho! */;

Todas as declarações acima são exatamente identicas pro compilador, pois ele enxerga essa expressão assim:

<identificador chamado "x"> <tipo do identificador "x">

E o tipo de x será "int*".

"int*" e "int" são coisas completamente diferentes pro compilador.

Pra testar isso você pode rodar esse código no teu compilador:

	char x = 'a';	char* y;	y = &x;printf("%d\n", sizeof(x));printf("%d\n", sizeof(y));
Dependendo do teu compilador e sistema operacional, você vai ver que x vai ter um tamanho na memória diferente de y.

Por isso, se a tua função tá retornando uma variável do tipo "int*", então na declaração dela é importante dizer pro compilador o tipo de retorno certo, pra ele poder alocar a memória suficiente.

Quanto a posição do asterisco que você vai usar... depende só do programador.

Eu sempre achei que fazia mais sentido colar o asterisco no tipo:

int* teste(float* x, float* y);

Porque quando meu cerebro olha pra essa expressão, é mais fácil pra mim entender que x e y são do tipo float*, e que a função retorna um int*.

O pessoal que compila o kernel do linux as vezes usam algo assim:

int * teste(float *x, float *y);

Provavelmente pra eles a expressão faz mais sentido desse jeito. Fica mais fácil ver que x e y são ponteiros pro tipo float.

Não existe um jeito mais correto que outro. A única coisa importante é que você crie o habito de ser consistente. Se escolher um estilo em particular, use ele durante o código inteiro... não fique misturando as coisas. Além disso, se estiver trabalhando no código de outra pessoa, prefira usar o estilo que ele(a) adotou pra aquele código, pra também não ficar misturando.

É isso.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Don

 

Não há diferença nenhuma quanto a posição do asterisco no momento da declaração da variável.
O compilador vai analisar o teu código descartando todos os espaços em branco, comentários, trocas de linha, tabs, etc.
Então:

1) int* x;
2) int *x;
3) int*x;
4) int
*
x
;
5) int* /* ola amiguinho */ x /* eu sou o dolinho! */;

Todas as declarações acima são exatamente identicas pro compilador, pois ele enxerga essa expressão assim:
<identificador chamado "x"> <tipo do identificador "x">

E o tipo de x será "int*".
"int*" e "int" são coisas completamente diferentes pro compilador.

Pra testar isso você pode rodar esse código no teu compilador:
 

	char x = 'a';	char* y;	y = &x;printf("%d\n", sizeof(x));printf("%d\n", sizeof(y));

Dependendo do teu compilador e sistema operacional, você vai ver que x vai ter um tamanho na memória diferente de y.
Por isso, se a tua função tá retornando uma variável do tipo "int*", então na declaração dela é importante dizer pro compilador o tipo de retorno certo, pra ele poder alocar a memória suficiente.

Quanto a posição do asterisco que você vai usar... depende só do programador.
Eu sempre achei que fazia mais sentido colar o asterisco no tipo:

int* teste(float* x, float* y);

Porque quando meu cerebro olha pra essa expressão, é mais fácil pra mim entender que x e y são do tipo float*, e que a função retorna um int*.
O pessoal que compila o kernel do linux as vezes usam algo assim:

int * teste(float *x, float *y);

Provavelmente pra eles a expressão faz mais sentido desse jeito. Fica mais fácil ver que x e y são ponteiros pro tipo float.

Não existe um jeito mais correto que outro. A única coisa importante é que você crie o habito de ser consistente. Se escolher um estilo em particular, use ele durante o código inteiro... não fique misturando as coisas. Além disso, se estiver trabalhando no código de outra pessoa, prefira usar o estilo que ele(a) adotou pra aquele código, pra também não ficar misturando.

É isso.

 

Boa noite,

 

Obrigado, amigo. Você trouxe uma luz. hahahaha

 

Valeu pela explicação!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×