Fazer um programa para:
incrementar o ponteiro, mostrando o conteúdo do endereço apontado (em forma de número). Caso o endereço coincida com o endereço de alguma outra variável, informar o fato.
incrementar o ponteiro, mostrando o conteúdo do endereço apontado (em forma de número). Caso o endereço coincida com o endereço de alguma outra variável, informar o fato.
Passo 1
Beleza, o enunciado pede um programa em C que:
- Tenha um ponteiro que aponte para uma variável (ou posição de memória).
- A gente deve incrementar esse ponteiro, mostrar o valor que ele “vê” (o conteúdo do local apontado) como número.
- Se, depois de incrementar, o endereço do ponteiro coincidir com o endereço de outra variável, a gente informa isso.
Conteúdo: conceitos de ponteiro em C (armazenar endereço,
O que vamos precisar:
p++
como aritmética de ponteiro, imprimir endereço com %p
, comparar ponteiros).O que vamos precisar:
- Uma “lista” de inteiros (ou variáveis) para que o
p++
tenha sentido. - Saber usar
printf
com%p
e%d
. - Entender que, em C,
ou seja,p++
anda exatamente o tamanho de umint
.
Passo 2
Antes de começar a resolver, vamos criar um “vetorzinho” de 2 inteiros:
int vars[2] = {10, 20};
Isso garante que, quando fizermos
p = vars;
, p
aponta para vars[0]
. E aí p++
passa a apontar para vars[1]
.Passo 3
Declarar e inicializar o ponteiro:
int *p = vars; // p aponta para vars[0]
Explicação: em C,
vars
(sem índice) é o endereço de vars[0]
. O ponteiro p
guarda esse endereço.Pra mostrar endereço e valor:
printf("p aponta para %p, valor: %d\n", (void*)p, *p);
%p
imprime um ponteiro (por isso o cast(void*)p
).*p
desreferencia, pegando o conteúdo no endereço quep
carrega.
Passo 4
Incrementar o ponteiro:
p++;
Teoria:
p++
fazpassando para o próximo inteiro em memória.
Logo depois, imprimimos de novo:
printf("Depois de p++:\n");
printf("p aponta para %p, valor: %d\n", (void*)p, *p);
Passo 5
Agora vamos comparar
p
com os endereços de vars[0]
e de vars[1]
:if (p == &vars[0])
printf("p coincide com vars[0]\n");
if (p == &vars[1])
printf("p coincide com vars[1]\n");
Em C, comparar ponteiros (
p == &x
) serve pra saber se eles apontam pro mesmo local.Resposta
#include <stdio.h>
int main() {
int vars[2] = {10, 20};
int *p = vars; // p aponta para vars[0]
// mostra endereços e valores iniciais
printf("Endereco de vars[0]: %p, valor: %d\n",
(void*)&vars[0], vars[0]);
printf("Endereco de vars[1]: %p, valor: %d\n\n",
(void*)&vars[1], vars[1]);
printf("Antes de incrementar:\n");
printf("p aponta para %p, valor: %d\n\n", (void*)p, *p);
// incrementa ponteiro
p++;
// mostra depois do incremento
printf("Depois de p++:\n");
printf("p aponta para %p, valor: %d\n", (void*)p, *p);
// verifica coincidência de endereços
if (p == &vars[0])
printf("p coincide com vars[0]\n");
if (p == &vars[1])
printf("p coincide com vars[1]\n");
return 0;
}