• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ziwdon

[Dúvida] *Pointers

8 mensagens neste tópico

Boas

Estou com alguma dificuldade em entrar nesta coisa dos pointers.

Eu já percebi que um pointer guarda o endereço de memoria de uma variável, e que seguindo esse endereço obtemos o valor da variável.

Estava aqui a seguir um tutorial para ver se começo a interiorizar melhor mas não estou a perceber o código exemplo.

#include <stdio.h>

int main()
{ 
    int x;            /* A normal integer*/
    int *p;           /* A pointer to an integer ("*p" is an integer, so p
                       must be a pointer to an integer) */

    p = &x;           /* Read it, "assign the address of x to p" */
    printf("Introduza um valor para 'x':\n");
    scanf( " %d", &x);          /* Put a value in x, we could also use p here */ --> LINHA X
    printf("Valor de 'x':\n");
    printf( "%d\n\n", *p ); /* Note the use of the * to get the value */
    getchar();
    system("pause");
}

O que não estou a conseguir entender é a 'LINHA X'.

Se '&x' nos indica o endereço da variável, não percebo como é que introduzimos um valor nesse mesmo endereço e não na própria variável.

Então...começamos por definir uma variável 'x' (inteiros) e um pointer '*p' para essa variável.

Ao valor do pointer atribuimos o endereço da variável, ficando assim o pointer a apontar para aquele endereço.

De seguida, o utilizador introduz um valor no endereço da variável que já foi anteriormente associado ao pointer 'p' (???).

Depois acedemos ao valor guardado na variável através do pointer.

Para mim seria mais lógico termos 'scanf( " %d", x);' na 'LINHA X' ao invés do que lá está...é que não percebo como é que o utilizador vai introduzir um inteiro que será guardado no lugar do endereço e não no próprio endereço da variável.

Alguém me pode explicar isto?

Obrigado

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando passas um argumento para uma função, a função apenas recebe uma cópia do argumento, logo, se passasses o valor de x, o scanf apenas conseguiria colocar o valor que leu na cópia de x, não sendo o valor da variável x da função main alterado.

Mas se passares o endereço da variável, o scanf fica a saber o endereço da variável original, e assim pode ir a essa localização alterar o valor da mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, vai aí uma confusão muito grande... o problema é que o scanf recebe um apontador para o sitio de memória onde queres guardar os dados lidos. De outra forma não tinhas como colocar o valor lido na variavel 'x'.

Para passar o endereço de memória onde queres escrever usas  &. Daí o scanf(" %d" , & x ). Como 'p' já é um apontador para esse endereço de memória, podias fazer scanf(" %d" , p );

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

omg  :wallbash: ...pois claro.

Umas semanas sem programar e depois é o que dá. Eu estava a fazer confusão com essa coisa do '&' indicar o endereço, e nem me lembrei que sempre fiz assim para atribuir um valor introduzido pelo utilizador a uma variável. Ainda assim agora ja fiquei a perceber o porque do '&' e o porquê do ser assim...e já percebo o facto de no tutorial eles dizerem "In fact, scanf works because of pointers!".

Mas já agora...com strings já nao se usa o '&' estou correcto?

Quando passas um argumento para uma função, a função apenas recebe uma cópia do argumento, logo, se passasses o valor de x, o scanf apenas conseguiria colocar o valor que leu na cópia de x, não sendo o valor da variável x da função main alterado.

Mas se passares o endereço da variável, o scanf fica a saber o endereço da variável original, e assim pode ir a essa localização alterar o valor da mesma.

Então sempre que enviamos uma variável para uma função temos de meter o '&'?

Cumps e obrigado

p.s. O que aconteceu ao 'addon' no forum que nos permitia seleccionar a linguagem do código introduzido? Até que dava jeito.

p.s.2. Desculpem lá a ignorância ;) lol

p.s.3. (AFTER EDIT) OK, ja reparei que colocaram o código em C...mas costumava haver aqui uma caixazinha pa seleccionar certo? Como não a vejo pensei que tivessem removido a feature ^^.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

p.s. O que aconteceu ao 'addon' no forum que nos permitia seleccionar a linguagem do código introduzido? Até que dava jeito.

p.s.2. Desculpem lá a ignorância ;) lol

p.s.3. (AFTER EDIT) OK, ja reparei que colocaram o código em C...mas costumava haver aqui um Caixazinha pa seleccionar certo? Como não a vejo pensei que tivessem removido a feature ^^.

'code=<lingugem>' em vez de apenas 'code' (exemplo, 'code=c').

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok thx ^^

Ja agora editei o post anterior para nao fazer double post mas ja foi tarde...

Quando passas um argumento para uma função, a função apenas recebe uma cópia do argumento, logo, se passasses o valor de x, o scanf apenas conseguiria colocar o valor que leu na cópia de x, não sendo o valor da variável x da função main alterado.

Mas se passares o endereço da variável, o scanf fica a saber o endereço da variável original, e assim pode ir a essa localização alterar o valor da mesma.

Então sempre que enviamos uma variável para uma função temos de meter o '&'?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então sempre que enviamos uma variável para uma função temos de meter o '&'?

Não é assim que deves pensar. Tal como disse a bocado, o scanf recebe o endereço de memória onde vai escrever os dados.

Para obteres o endereço de memória de uma variável, usamos o '&'. Mas no caso das strings (arrays de caracteres), o nome da string (array) já é um apontador para o endereço de memória dos dados. Por isso é que não se usa o '&'.

À bocado tinhas

int x;

int * p = & x ;

por isso podias fazer

scanf( "%d" , & x ) ;  // tanto "&x" como simplemente "p" são o endereço de memória da variável 'x'

scanf("%d" , p ) ;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora