Ir ao conteúdo
  • Cadastre-se

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


Luan Farias
Ir à solução Resolvido por Luan Farias,

Posts recomendados

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.

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...