• Prezados usuários,

    Por questões de segurança, a partir de 22/04/2024 os usuários só conseguirão logar no fórum se estiverem com a "Verificação em duas etapas" habilitada em seu perfil.

    Para habilitar a "Verificação em duas etapas" entre em sua conta e "Click" em seu nick name na parte superior da página, aparecerá opções de gestão de sua conta, entre em "Senha e segurança", a primeira opção será para habilitar a "Verificação em duas etapas".

    Clicando alí vai pedir a sua senha de acesso ao fórum, e depois vai para as opções de verificação, que serão as seguintes:

    ***Código de verificação via aplicativo*** >>>Isso permite que você gere um código de verificação usando um aplicativo em seu telefone.

    ***Email de confirmação*** >>>Isso enviará um código por e-mail para verificar seu login.

    ***Códigos alternativos*** >>>Esses códigos podem ser usados para fazer login se você não tiver acesso a outros métodos de verificação.

    Existe as 3 opções acima, e para continuar acessando o fórum a partir de 22/04/2024 você deverá habilitar uma das 03 opções.

    Tópico para tirar dúvidas>>>>https://forum.adrenaline.com.br/threads/obrigatoriedade-da-verificacao-em-duas-etapas-a-partir-de-24-04-2024-duvidas.712290/

    Atencionamente,

    Administração do Fórum Adrenaline

[C++]Ponteiros e Arrays

xande010

=]
Registrado
Eu estou tentando aprender sobre ponteiros, e aprendi que existe uma relação entre ponteiros e arrays.

O que eu queria era construir um vetor só com ponteiros. Percebi que estava dando erro quando eu tentei fazer com (&array + n). Para fazer o teste, eu fiz uma função que transforma hexadecimal em decimal.

Só que não consigo passar o valor hexadecimal do ponteiro à função.

Eu adaptei o código para isso:
Código:
char teste;
cout << &teste;

E a saída que eu consegui foi
Eu achei estranho, pois não é igual ao int.
Eu li que "&" seguido de uma variável é o local da mesma.
Código:
int teste;
cout << &teste;
A saída desse segundo teste foi em hexadecimal.

Por que funciona com int e não com char?
Eu até tentei new char, e deu no mesmo.
Até mesmo o ponteiro não funciona:
Código:
    char* teste;
    char variavel = 'a';
    teste = &variavel;
    cout << teste;
a saída foi uma string de 4 dígitos, acho que é porque Code::Blocks usa 4 bytes para ponteiros.

Eu gostaria de saber o que estou fazendo de errado. Não ajuda muito também que sou um programador bem iniciante :haha:
Eu vou tentar achar algo sobre ponteiros, porque é bem difícil de usar no começo

Muito obrigado à todos. E se eu falei alguma bosta, eu agradeço se corrigir =]
 
Última edição:
O teste que você fez tá certo, mas o problema é o C++ aqui...

Quando você fez
C++:
char teste;
cout << &teste;

E você obteve uma saída indesejada, é porque o operador << está sobrecarregado para printar uma string que começa no endereço que você passou, no caso, você está passando o endereço de teste (&teste).

Se você tentar usar printf, que é a função de print do C, você vai obter a resposta desejada...

Porém, você pode obter o endereço de teste com cout fazendo um type-casting (conversão de tipo) de char para int.

O código ficaria assim:

C++:
char teste;
cout << (int*)&teste;

Ou você pode usar a função do C, que ficaria assim

C:
printf("%p", &teste);

Onde %p diz para a função que estamos printando um ponteiro (existem ainda %d, %f, %x, %c, %s, %n... etc, se quiser saber dá uma procurada que existem vários lugares explicando), e o segundo parâmetro, aquele depois da vírgula é o que o %p vai tentar printar...


Sobre sua segunda tentativa e ter obtido uma saída esquisita
a saída foi uma string de 4 dígitos, acho que é porque Code::Blocks usa 4 bytes para ponteiros.

Não é o C::B que usa 4 bytes para ponteiros, isso é uma coisa da linguagem/arquitetura. Todo ponteiro contém 4 bytes pois um ponteiro é nada mais que um número na memória, sempre.
Eles não estão necessariamente ligados a arrays, mas arrays usam ponteiros para se localizar na memória

No caso de aplicações 64 bits, os ponteiros passam a ter 8 bytes,
fiz um programa teste para você enchergar o funcionamento de um ponteiro

C:
#include <stdio.h>

int main(){
    int a = 1;
    int *p = &a;
    printf("a vale %d, endereco de a vale %p e p vale %p\n\n", a, &a, p);
    *p = 199;
    printf("agora a vale %d, endereco de a vale %p e p vale %p\n\n", a, &a, p);

    return 0;
}

E a saíde que eu obtive foi:

Código:
a vale 1, endereco de a vale 0x7fff360a3434 e p vale 0x7fff360a3434

agora a vale 199, endereco de a vale 0x7fff360a3434 e p vale 0x7fff360a3434

Como você pode observar, dentro de p contém o endereço de a, pois ele está atuando como um ponteiro para a
Se a fosse um array, ele estaria apontando para o início desse array.

O que acontece na memória é que você tem vários valores guardados uns juntos de outro e quando você tem arrays, os valores atuam como qualquer outro, na memória é tudo a mesma coisa, um monte de números, mas quando você tem um array existe um ponteiro que fica no início e que ele vai andar i*4 bytes pra frente pra pegar o próximo valor.

No futuro você poderá estar mechendo com várias camadas de ponteiros, e vai ter coisas tipo ***p, não se assuste, é só seguir e você vai ver que é um ponteiro que aponta pra outro e assim vai.
Ele pode estar apontando para o endereço de início de uma função, para um array ou só para um número... ponteiros são bem flexíveis
Mas como o nome diz, ele só aponta para um lugar, nada mais

Se tiver mais duvida posta aí, eu gosto de ajudar :haha:
 
Última edição:

Users who are viewing this thread

Voltar
Topo