Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Bernardo Vieira

Duvida sobre Ponteiros

Mensagens Recomendadas

Bernardo Vieira

bom, eu vou publicar o codigo e explicar nele

int main() {
system ("color 17");
system ("title JANELA DE TESTES");
int vetor[2];
int z,x;
int *ptr;
int *xptr;//se eu nao usar isto-----------------------------------------------------------------------------------------------------------
int **ptrptr;
int *v;
v=vetor;
cout<<"Introduza o vetor 1"<<endl;
cin>>v[0];
cout<<"Introduza o vetor 2"<<endl;
cin>>v[1];
cout<<"o valor do vetor 1 é "<<vetor[0]<<" e do vetor 2 é "<<vetor[1]<<" sucesso!"<<endl;
trocar(v[0],v[1]);
cout<<"valores trocados seria "<<vetor[0]<<" e "<<vetor[1]<<" sucesso!"<<endl;
system("cls");
cout<<"Insere um valor"<<endl;
cin>>z;
ptr=&z;
cout<<"Insere outro valor"<<endl;
cin>>x;
xptr=&x;//nem isto------------------------------------------------------------------------------------------------------------------------
ptrptr=&ptr;
cout<<"o primeiro valor é "<<*ptr<<" e "<<**ptrptr<<" sucesso"<<endl;
ptrptr=&xptr;//e aqui usar *ptrptr=&x;--------------------------------------------------------------------------------------------------------
cout<<"separados seria "<<*ptr<<" e "<<**ptrptr<<" sucesso"<<endl;
cout<<"em hexadecimal seria "<<ptr<<" e "<<ptrptr<<" sucesso"<<endl;
return 0;
}

entao basicamente o que acontece é que no console vai aparecer no caso de eu usar o codigo tal como ele esta acima é isso

o primeiro valor é 2 e 2 sucesso
separados seria 2 e 3 sucesso
em hexadecimal seria 0x22ff0c e 0x22ff00 sucesso

mas se eu usar como expliquei nos comentários aparece assim

o primeiro valor é 2 e 2 sucesso
separados seria 3 e 3 sucesso
em hexadecimal seria 0x22ff0c e 0x22ff00 sucesso

alguém pode me explicar porque ? é a primeira vez que estou a usar ponteiros, e estou a guiarme por um tutorial, mas decidi nao fazer exatamente igual, entao surgiu esse problema e fiquei com a duvida...

Editado por Bernardo Vieira

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

a primeira coisa que tens de fazer é :

- começar a escrever código de forma legível ...

- remover todo o código que é desnecessário para o teu problema

isso fica assim :

#include <iostream>

int main() {
 int z, x;
 int *ptr;
 int *xptr;
 int **ptrptr;

 cout << "Insere um valor" << endl;
 cin >> z;
 ptr = &z;

 cout << "Insere outro valor" << endl;
 cin >> x;
 xptr = &x;

 ptrptr = &ptr;
 cout << "o primeiro valor é " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//                              (valor em z)       (valor em z)

 ptrptr = &xptr;
 cout << "separados seria " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//                              (valor em z)       (valor em x)

 cout << "em hexadecimal seria " << ptr << " e " << ptrptr << " sucesso" << endl;

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

sim, mas eu percebi, e basicamente o que fizeste foi apagar a outra parte do codigo que nao interessa no assunto, mas vá, a minha duvida era, se eu podia fazer o que acabaste de fazer (com o teu codigo) mas sem usar o "int *xptr;"

essa é a minha duvida

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

#include <iostream>

int main() {
 int z, x;
 int *ptr;
 int *xptr;
 int **ptrptr;

 cout << "Insere um valor" << endl;
 cin >> z;
 ptr = &z;

 cout << "Insere outro valor" << endl;
 cin >> x;
 xptr = &x;

 ptrptr = &ptr;
 cout << "o primeiro valor é " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//							  (valor em z)	   (valor em z)

 ptrptr = &xptr;
 cout << "separados seria " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//							  (valor em z)	   (valor em x)

 cout << "em hexadecimal seria " << ptr << " e " << ptrptr << " sucesso" << endl;

 return 0;
}

basicamente esse código mas sem o ponteiro " int *xptr; " ou seja, se posso poupar um ponteiro! é possivel? eu nao quero fazer nada em especifico, estou só a aprender! quando souber algumas coisas (tipo bastante) é que começo a desafiar me com coisas mais dificeis

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

e eu respondo, porque se eu nao usar nao dá certo! no meu primeiro post tens os resultados, eu tentei na usar, mas nao dava!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

assim é complicado, só é possível dizer se é necessário ou desnecessário sabendo o que raio pretendes fazer !

enquanto andares a responder dessa forma continuarás a não ter resposta ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

se assim funciona

#include <iostream>

int main() {
 int z, x;
 int *ptr;
 int *xptr;
 int **ptrptr;

 cout << "Insere um valor" << endl;
 cin >> z;
 ptr = &z;

 cout << "Insere outro valor" << endl;
 cin >> x;
 xptr = &x;

 ptrptr = &ptr;
 cout << "o primeiro valor é " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//							  (valor em z)	   (valor em z)

 ptrptr = &xptr;
 cout << "separados seria " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//							  (valor em z)	   (valor em x)

 cout << "em hexadecimal seria " << ptr << " e " << ptrptr << " sucesso" << endl;

 return 0;
}

porque é que nao funciona assim ?

#include <iostream>

int main() {
 int z, x;
 int *ptr;
 int **ptrptr;

 cout << "Insere um valor" << endl;
 cin >> z;
 ptr = &z;

 cout << "Insere outro valor" << endl;
 cin >> x;

 ptrptr = &ptr;
 cout << "o primeiro valor é " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//							  (valor em z)	   (valor em z)

 ptrptr = &x;
 cout << "separados seria " << *ptr << " e " << **ptrptr << " sucesso" << endl;
//							  (valor em z)	   (valor em x)

 cout << "em hexadecimal seria " << ptr << " e " << ptrptr << " sucesso" << endl;

 return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

No primeiro codigo, correctamente, tens

  ptrptr = &xptr;

Nesta situacao, ptrptr tem o tipo int** e &xptr tem o tipo int**, portanto tudo funciona bem.

No segundo codigo, erradamente, tens

  ptrptr = &x;

Nesta situacao, ptrptr tem o tipo int** e &x tem o tipo int*, e como os tipos nao sao compativeis nao funciona bem.

Em C, podes configurares o compilador para te avisar destas falhas de coerencia entre tipos (suponho que em C++ tambem; possivelmente ate estas falhas originam erros de compilacao).

  • Voto 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Bernardo Vieira

desculpa, esquecime, assim dá erro, tem de ser "*ptrptr = &x;" e assim nao dá erro! mas dá o mesmo valor tanto em ptrptr como em ptr e nao podia...acho eu porque supostamente se usar *ptrptr passa a ser do tipo int* e x tbm é int*

e porque ptrptr vai ficar a apontar para x e ptr já esta a apontar para z

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.