Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luthien

ponteiros

Recommended Posts

Estou aproveitando as ferias pra dar uma revisada na materia e tive essa dúvida

 

 

 

    int *ptr1, *ptr2, numero;
    ptr1 = (int*) malloc(sizeof(int));
    ptr1 = 7;
    printf("Endereco PTR1: %d", &ptr1);
    ptr2 = ptr1;
    printf("Endereco PTR2: %d", &ptr2);
//  free(ptr1);
//  numero = *ptr2;
É uma duvida sobre ponteiro solto. Sei que ponteiro solto é um ponteiro que tem endereço de uma célula de memória que já foi liberada. Minha dúvida surgiu quando fui testar imprimindo os endereços de ptr1 e ptr2, pq imprimiu endereços diferentes. Ao fazer ptr2 = ptr1 eu estou passando só o conteúdo de ptr1? Pq na explicação da apostila fala q é endereço... se for apenas o conteúdo não vai ser um ponteiro solto pq ptr2 tem seu próprio endereço e o free() que foi dado em ptr1 não vai interferir, certo? Fiquei confusa com esse código

Só comentei as linhas ali pra poder testar sem dar erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

ptr1 e ptr2 são duas variáveis diferentes. Logo, mesmo que apontem para o mesmo endereço de memória, elas ocuparão endereços diferentes na memória.

 

Você está usando &ptr1 e &ptr2, que representam os endereços dos ponteiros na memória. Se você quiser exibir o endereço para o qual eles apontam, deve usar ptr1 e ptr2. E para exibir seus valores, use *ptr1 e *ptr2/

 

Outro erro no seu código foi atribuir o número 7 ao endereço para o qual ptr1 aponta. Creio que você queria atribuir o valor 7 a ele. Ou seja, deveria usar "*ptr1 = 7;".

 

Teste este código para entender melhor:

 

int *ptr1, *ptr2;
ptr1 = (int*) malloc(sizeof(int));
*ptr1 = 7;
printf("Endereco PTR1: %p\n", ptr1);
ptr2 = ptr1;
printf("Endereco PTR2: %p\n", ptr2);
printf("Valor de ptr1: %d\n", *ptr1 );
printf("Valor de ptr2: %d\n", *ptr2 );

 

Veja que ptr1 e ptr2, de fato, apontam para o mesmo endereço. E também possuem o mesmo valor.

Porém, &ptr1 e &ptr2 terão valores distintos, pois estamos falando de dois ponteiros, que ocupam endereços distintos na memória

Compartilhar este post


Link para o post
Compartilhar em outros sites

Complementando a explicação do Beraldo.

 

Em um contexto menos técnico pode-se dizer que cada ponteiro possui 3 valores:

- Endereço onde ele está

- Endereço para qual ele aponta

- Valor para qual ele aponta

 

Considerando o seguinte código:

int *p1, *p2;
p1 = (int*)malloc(sizeof(int));
p2 = p1;

// onde eles estão?
printf("p1 esta em: %p\n", (void*)&p1); // diferente
printf("p2 esta em: %p\n", (void*)&p2); // diferente

// para onde eles apontam?
printf("p1 aponta para: %p\n",(void*)p1); // igual
printf("p2 aponta para: %p\n",(void*)p2); // igual

// alterando o valor
*p1 = 2015;

// valor para qual eles apontam?
printf("p1 tem valor: %d\n",*p1); // igual, 2015
printf("p2 tem valor: %d\n",*p2); // igual, 2015
Quando eu alterei o valor de p1, como ambos apontam para o mesmo valor, p2 também foi alterado. Se eu liberar a memória para qual p1 aponta, a memória de p2 também será liberada gerando um ponteiro solto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, muito obrigada me ajudou mt. Quanto ao código, era o que o prof usou para explicar ponteiros soltos, só acrescentei os printfs pra testar mesmo. Ficou tão mais fácil de entender, valeu mesmo! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.