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

suzy

ponteiros

6 mensagens neste tópico

:-[ Viva! tenho aqui um programar que não consigo entender o resultado de execução  :hmm:

#include<stdio.h>
main()
{
int i = 2, j = 3, *p, *q;
p=&i;
q=p;
printf("%d %d\n", i, j);
q=&j;
*p=*q;
printf("%d %d\n", i, j);
*p = *p + 10;
(*q)++;
printf("%d %d\n", i, j);

fflush(stdin);
getchar();
}

o resultado de execução e

    2  3 // aqui entendo é facil, mas agora começo a nao entender  :cheesygrin:

    3    3

  13  4

porque? aonde é que ponteiros vao influenciar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include<stdio.h>
main()
{
int i = 2, j = 3, *p, *q;
p=&i;  // "p" vai ficar com o endereço de memória de "i", e não com o seu número
q=p;   // "q" toma o valor de "p", logo fica com o mesmo valor (endereço de memória)
printf("%d %d\n", i, j); // 2 3

q=&j;  // "q" toma o valor do endereço de memória de "j"
*p=*q;  // O apontado de "p" vai tomar o valor do apontado de "q". Como "p" tem o endereço de memória de "i", o valor armazenado vai ser o de "j", já que "q" possui o endereço de memória de "j"
printf("%d %d\n", i, j);  // 3 3

*p = *p + 10;  // Aqui é fácil, o valor que está no apontado de "p" ( "i") vai ser incrementado 10 vezes
(*q)++;   // O valor que está no apontado de "q" ("j") vai ser incrementado 1 vez
printf("%d %d\n", i, j); // 13 4

fflush(stdin);
getchar();
}


Adicionei alguns comentários...

Mas isto não é fácil de perceber...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não há necessidade para tanta confusão.

O que vocês têm é isto: dois inteiros e dois apontadores. Vamos representá-los.

[  i  ] [  j  ]

  5      6

Vamos supor que o endereço de memória de i é 5 e de j é 6.

Logo, &i = 5, &j = 6

int i = 2, j = 3, *p, *q;

[  2  ] [  3  ]

  5      6

p=&i;

[  2  ] [  3  ]

  5      6

p = 5

q=p;

[  2  ] [  3  ]

  5      6

p=5; q=5;

printf("%d %d\n", i, j);

Imprime-se o conteúdo de i e j, logo, 2 e 3

q=&j;

q fica com o endereço de j, logo, 6.

[  2  ] [  3  ]

  5      6

p=5; q=6;

*p=*q;

[  3  ] [  3  ]

  5      6

p=5; q=6;

Como p era 5, vamos alterar o valor da posição 5.

printf("%d %d\n", i, j);

Imprimimos 3 3.

*p = *p + 10;

Aumentamos o valor de *p em 10, logo:

[  13  ] [  3  ]

    5        6

p=5; q=6;

(*q)++;

Aumentamos o valor de *q.

[  13  ] [  4  ]

    5        6

p=5; q=6;

printf("%d %d\n", i, j);

Imprimimos 13 e 4

------------

No comentário do Hipnoted

p=&i;  // "p" vai ficar com o endereço de memória de "i", e não com o seu número

Não é propriamente verdade. Se p aponta para i, então p fica igual a i.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não há necessidade para tanta confusão.

....

No comentário do Hipnoted

p=&i;  // "p" vai ficar com o endereço de memória de "i", e não com o seu número

Não é propriamente verdade. Se p aponta para i, então p fica igual a i.

Mas "p" não fica com o valor de "i", fica com o endereço. "*p" é que fica com o valor de "i".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ya, sempre que tem o asterisco tem a ver com o conteudo e não com o endereço...O hipnoted explicou bem isso..

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