Passagem de variáveis e ponteiros em C: Não se engane!

Tive um problema noob com C… No final do post vão entender o meu “probleminha”.

A passagem de parâmetros em C é complicada inicialmente, mas depois não há problemas, você entende a lógica da coisa! Mas se você esquece um pouco das características de C e depois voltar, pode encontrar-se com errinhos que não te deixam dormir!

Sobre a passagem de parâmetros em C:

A passagem de parâmetros é feita por cópia de conteúdo, ou seja, você não envia uma referência da variável, você realmente tem uma variável local com o conteúdo que foi enviado. Alguns casos são excessões(Assim como em Java algumas variáveis são passadas por conteúdo também, as primitivas) como ponteiros e vetores(São um tipo meio diferente de ponteiro) .

Não vou entrar em detalhe sobre ponteiros, mas eles são variáveis que apontam para outras, ou seja, o conteúdo de um ponteiro é o endereço para outra variável. A declaração de um ponteiro faz-se usando o “*”, onde o ponteiro tem um tipo para o qual ele aponta(char *p: aponta para um char). O acesso ao endereço de uma variável é feito por “&”, e para acessar o conteúdo de onde um ponteiro aponta você usa o “*”. Um exemplo simples.

Resumindo, ponteiros em C são muito importantes importantes.


Bem, o problema que consegui, bem principiante sabendo essa teoria acima, foi relacionado a lista ligada, onde em uma função eu não conseguia alterar a variável local, a que chama
a função. Perdi 1 hora com isso até que resolvi postar no maior fórum do maior site de C++(eu não achei um de C bom até hoje) do mundo(cplusplus.com)! Postei no JavaFree também hehehe. O pessoal deste dois fórum me ajudaram!
Bem, o caso foi que eu achaa que eu era o bonitão passando um ponteiro como parâmetro, sendo que esqueci que ponteiro não é nada mais que uma variável, onde o seu conteúdo também será copiado… Olhe a forma [b]errada[/b].

Isso acima está errado, a minha função recebe um ponteiro, eu achava, de forma ridícula, que o conteúdo do ponteiro iria modificar a variável de origem =<. Bem, é óbvio que não. Nota-se um erro conceitual, na verdade uma confusão com o conceito… Eu recebia uma variável do tipo ponteiro, e não uma referência para uma variável!. Eu conhecia ponteiro para ponteiro, até ponteiro para ponteiro para ponteiro, até… Brincadeira hehe, quando li as respostas nos fóruns e tive meus olhos abertos, foi fácil ajeitar.

Para quem está acompanhando, atenção para este ponto:
(*lista)
Onde eu acesso o conteúdo de meu ponteiro para ponteiro, ou seja, outro ponteiro! Assim eu modifico os atributos dele! Não localmente como eu estava fazendo anteriormente…
Atenção para a chamada agora:

//declarando:
struct _lista *teste;

//chamando o método de remoção:
remover(&teste, eliminado);

Observem que mesmo sendo um ponteiro, eu passo a referência [do|para] meu ponteiro, o endereço!
Para quem quiser conhecer a lista duplamente ligada inteira(espero que não copiem para trabalho de escola…)

Uma resposta

  1. […] SO Posts RSS satteltaschen c blog pessoal ponteiros São um tipo meio diferente de ponteiro Passagem de variáveis e ponteiros em C: Não se engane! forma [b]errada[/b] RSS dos comentários O fim do SO, mesmo com computação nas nuvens privacidade […]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: