Jump to content

[Dúvida] *Pointers


Carloz

Recommended Posts

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

"Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)

Link to comment
Share on other 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.

Link to comment
Share on other 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 );

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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 ^^.

"Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)

Link to comment
Share on other 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').

Link to comment
Share on other 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 '&'?

"Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)

Link to comment
Share on other 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 ) ;

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.