Ir ao conteúdo

C++ ponteiros com output estranho


Ir à solução Resolvido por kgin,

Posts recomendados

Postado

Bom galera eu estou com umas duvidas sobre ponteiros em c++, eu fiz o seguinte codigo para testar

 

 

<code>

char first[10] = "abc";

 

char * purl;

 

purl = first;

 

cout << purl << *purl << endl;

 

<code>

 

mas o output foi muito diferente do que eu esperava, não entendi porque "purl" retornou a string completa "abc" e não o endereço para variavel first.

  • Solução
Postado
51 minutos atrás, XPointersX disse:

mas o output foi muito diferente do que eu esperava, não entendi porque "purl" retornou a string completa "abc" e não o endereço para variavel first.

não sei C++, mas eu acho que você se deparou com uma coisa herdada do C.

Creio eu que o objeto cout reconheça o ponteiro como uma string do tipo C terminada com null.

para contornar isso você pode fazer uma promoção (cast) no ponteiro para void.

exemplo

#include <iostream>

using namespace std;

int main ()
{
  char first[10] = "abc";
  char *purl;
  purl = first;
  cout << (void *) purl << '\n' << *purl << endl;
}

 

  • Curtir 1
Postado

Poste um código completo, compilável.

 

Use o tal botão code como descrito no primeiro post do forum.

 

Algo assim seria a saída

 

#include <iostream>
using namespace std;

int main(void)
{
    char first[10] = "abc";
    char* purl;

    purl = first;
    cout << purl << *purl << endl;

    return 0;
}

 

 

Em relação ao programa

 

Você declarou first como char[10]. Em C++ seria normal usar a classe string mesmo e não char[] para uma string, já que inicializou como tal. 

 

Ao declarar algo entenda que declara um NOME associado a um TIPO. Como o compilador pode te dizer, purl é char*, um ponteiro para char. Essa é a realidade. Em sendo purl um char* é claro que *purl é char porque essa é a definição do operador *. Só que isso é consequência da delcaração. Não é a declaração, como acabei de explicar.

 

Ao escrever assim só contribui para a confusão, e de fato já confundiu você.

 

Prefira sempre

 

        char*     purl = first;

 

porque é mais claro: purl é um ponteiro para char inicializado com o endereço do primeiro byte do vetor de char first, que é char[10], como declarado.

 

Sobre

 

    cout << purl << *purl << endl;

 

Entenda:

 

purl é um ponteiro para char. cout tem uma definição para char* --- se chama overload --- e então vai imprimir tudo que tiver a partir do endereço inicial até encontrar um 0, o popular NULL. Isso quer dizer "abc".

 

*purl é claro como já expliquei e como está declarado, um char, e cout vai imprimir uma letra, o 'a'.

 

Isso explica a saída abca.

 

Se quer o endereço pode usar
 

        cout << hex << &purl << "\n";

 

E o operador & --- conhecido como address of --- vai fazer o que quer.

 

hex é um especificador para cout mostrar o valor em hexadecimal e pode geral um valor de 4 ou 8 bytes conforme o modelo de compilação que esteja usando, 32 ou 64 bits para um ponteiro.

 

#include <iostream>
using namespace std;

int main(void)
{
    char first[10] = "abc";
    char* purl      = first;

    cout << purl << *purl << endl;
    cout << hex << &purl << "\n";

    return 0;
}

 

Que deve mostrar algo como 

 

abca
0095FC8C

 

em 32 bits.

 

 

 

  • Curtir 1
  • Obrigado 1
Postado
23 minutos atrás, arfneto disse:
cout << hex << &purl << "\n";

Mas nesse caso ele iria retornar o endereço do ponteiro e não da variavel first?

Postado
59 minutos atrás, XPointersX disse:

Mas nesse caso ele iria retornar o endereço do ponteiro e não da variavel first?

 

Sim... como está no cout. É só um exemplo.

 

O operador é aquele e a variável vem depois...

  • Obrigado 1
Postado

@arfneto Mas pelo o que eu percebi, isso não retornaria o endereço da variável purl ao invés do endereço da variável first

1 hora atrás, arfneto disse:
cout << hex << &purl << "\n";

 

Só dando pitaco mesmo 😁

  • Amei 1
  • Confuso 1
Postado

@kgin  Como eu disse...

 

5 horas atrás, arfneto disse:

Sim... como está no cout. É só um exemplo.

 

O operador é aquele e a variável vem depois...

 

O operador & --- address of --- pega o endereço da variável...  Isso é um exemplo. Achei que dava pra entender 😞

 

Se quer o endereço de x usa &x. &First[9] é o endereço do último byte do array por exemplo...

 

Estou apenas mostrando o porque da saída do programa ter sido aquela e como faria para pegar um endereço de algo e mostrar em hexadecimal.

 

Não vi razão para usar aquela particular variável, mas parece que todos acharam que deveria ser aquilo. Não, não deveria. Trata-se de um exemplo.

 

 

  • Obrigado 1
Postado
8 horas atrás, arfneto disse:

Não vi razão para usar aquela particular variável, mas parece que todos acharam que deveria ser aquilo. Não, não deveria. Trata-se de um exemplo.

Eu estava querendo entender o motivo do c++ não mostrar o output que eu esperava, aquele programa não tinha funcionalidade nenhuma. 🙂

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...