1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Pointers em C

Discussão em 'Programação' iniciada por ravager, 23 de Fevereiro de 2008. (Respostas: 7; Visualizações: 1104)

  1. ravager

    ravager Power Member

    Boas,

    Eu já ando nisto da programação há algum tempo... mas agora na univ ando de volta do C.
    Não consigo entender a lógica dos pointers (para que servem, o porquê de serem usados, etc.) e já estou farto de procurar em tutoriais uma explicação "for dummies" para esta função. Já li em diversos livros, vários tutoriais de internet, e fico sempre na mesma...

    A única coisa que percebo é que estes são fundamentais para poder passar os valores dentro de uma função para fora da mesma... mas não consigo entender as vantagens, em programação, do uso deles ao invés de uma variável "vulgar" sem o * atrás...

    Se fosse possível ajudarem-me...
     
  2. hYpe

    hYpe [email protected] Member

    Ao passares uma variável por parametro sem apontador, não estás a pensar essa mesma variável, mas sim uma cópia dela.

    Ou seja, o valor que entra é o mesmo, mas se alterares o valor dentro da função, essas alterações nao se repercutem no resto do programa. Porquê? Porque tas a alterar o valor à cópia, e não à variável original.

    Vê este vídeo do youtube: http://uk.youtube.com/watch?v=f-pJlnpkLp0 , vai ajudar-te a entender isso.
     
  3. rj.rodrigues

    rj.rodrigues Power Member

    O ponteiro é uma variavel que contém um endereço de memoria (ou seja, aponta para esse endereço de memoria).
    Nesse endereço vai estar o conteudo do que defeniste (tipo inteiro, double, ...).
    Por exemplo, um array:
    int* arr
    arr é um ponteiro que aponta para o inicio do array,
    ao fazer arr++ , arr fica a apontar para a 2a posição do array.

    Outro exemplo:
    passagem de parametros:
    Código:
    void main(){
      int n1 = 2;
      int n2 = 4;
      funçao(&n1, n2);
    }
    int funcao(int* var1, int var2){ (...)
    var1 é um ponteiro para um inteiro, var2 é um inteiro.
    ao alterares var1(ou melhor o conteudo) n1 vai estar alterado quando voltares a main, isto porque tas a alterar na memoria.
    no caso de var2, n2 n sera alterado, porque var2 é um copia de n2, ou seja outra posiçao de memória.

    É +/- insto
     
    Última edição: 24 de Fevereiro de 2008
  4. Tyran

    Tyran Power Member

    Troca essa linha
    Código:
    funcao( &n1, n2);
    
    Tens de meter o '&' que é o endereço de memória, e o pointer fica a apontar para aí...

    cumpzz
     
  5. rj.rodrigues

    rj.rodrigues Power Member

    Ya, esqueci-me disso :p
    Obrigado
     
  6. ravager

    ravager Power Member

    Ou seja...

    Exemplificando, temos um inteiro x, que vale por exemplo 10, na posição de memória 1234.

    Se fizermos *x, a variável x está a apontar para o endereço 1234 (que possui o 10). E ao fazermos a linha de código printf("%d", *x), escreve o valor que está na posição de memória 1234 (o 10).
    Ao fazermos ao invés printf("%d", &x), esta linha devolverá 1234 (o valor do endereço de memória para o qual o ponteiro aponta). Certo?

    Fiquei é na dúvida nesse exemplo de função...

    Ao criarmos a função, fazemos p.ex.

    Código:
    int exemplo (int *n1, int *n2)
    Ao chamarmos a função, terá de ser do género

    Código:
    void main ()
    {
      exemplo (&n1, &n2) 
    } 
    para irmos buscar os endereços onde n1 e n2 estão armazenadas, ao invés de criar cópias das mesmas em memória, que não nos permitirão salvaguardar as alterações efectuadas nas variáveis, dentro da função?
    Assim como é sempre necessário usar a função malloc em variáveis-ponteiro? Em estruturas (listas, árvores, etc.) sei que é essencial, mas em simples inteiros não sei se é necessário...
     
    Última edição: 24 de Fevereiro de 2008
  7. Baderous

    Baderous Banido

    Não podes transformar assim um inteiro do nada num apontador. Se tiveres o inteiro x com o valor 10 na posição 1234, se quiseres referenciar essa variável necessitas de um apontador para ela. Ex: int x=10; int *px=&x;
    Isto quer dizer que a variável px é um apontador (*) para uma variável de tipo inteiro (int), cujo endereço que armazena é o da variável x (&x).
    Portanto: printf("%d",&x) -> 1234; printf("%d",*px) -> 10; printf("%d",x) -> 10

    Se declarares uma função com 2 parâmetros que são apontadores (*), depois na main tens que invocar essa função passando os endereços (&). O uso dos apontadores prende-se sobretudo com a alteração dos valores das variáveis que depois podem ser aproveitados noutras funções, tal como já tinha sido referido.
     
  8. good_in_bed

    good_in_bed Power Member

    Tu tens e que estudar um pouco de AC para perceberes o que se passa na memoria...Senão estares assim a perceber as coisas, porque sabes que é muito importante, acabas por não perceber realmente...
    Tu quando invocas uma função, ou crias estruturas de dados, há procedimentos que ocorrem ao nível da memória, em termos da função que invoca, das variáveis locais, do endereço de retorno, .... , uma série de coisas, que convém que saibas como funcionam para perceberes realmente isso dos apontadores, arrays e afins..
     

Partilhar esta Página