Carloz Posted December 31, 2007 at 07:00 PM Report Share #157275 Posted December 31, 2007 at 07:00 PM 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 More sharing options...
Rui Carlos Posted December 31, 2007 at 07:09 PM Report Share #157277 Posted December 31, 2007 at 07:09 PM 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. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2007 at 07:11 PM Report Share #157278 Posted December 31, 2007 at 07:11 PM 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 More sharing options...
Carloz Posted December 31, 2007 at 07:38 PM Author Report Share #157281 Posted December 31, 2007 at 07:38 PM omg ...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 More sharing options...
Rui Carlos Posted December 31, 2007 at 07:42 PM Report Share #157283 Posted December 31, 2007 at 07:42 PM 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'). Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Carloz Posted December 31, 2007 at 07:45 PM Author Report Share #157284 Posted December 31, 2007 at 07:45 PM 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 More sharing options...
mogers Posted December 31, 2007 at 08:30 PM Report Share #157286 Posted December 31, 2007 at 08:30 PM 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 More sharing options...
Carloz Posted December 31, 2007 at 10:28 PM Author Report Share #157287 Posted December 31, 2007 at 10:28 PM Ok. Está percebido. Muito obrigado 😉 "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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now