Ir ao conteúdo
  • Cadastre-se

C++ ponteiros com output estranho


Visitante
Ir à solução Resolvido por kgin,

Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

  • Solução
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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