Jump to content
Bernardo Vieira

Duvida sobre Ponteiros

Recommended Posts

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...

Edited by Bernardo Vieira

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites
HappyHippyHippo

mas eu não faço ideia do que queres fazer ! logo não sei se é possível fazer ...


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

Share this post


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

Share this post


Link to post
Share on other sites
Bernardo Vieira

usar mais um ponteiro significa usar mais espaço na memoria! ou estarei enganado?

Share this post


Link to post
Share on other 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!

Share this post


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

Share this post


Link to post
Share on other 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;
}

Share this post


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

  • Vote 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!

Share this post


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.