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.

Passo 1

Beleza, o enunciado pede um programa em C que:
  1. Tenha um ponteiro que aponte para uma variável (ou posição de memória).
  2. A gente deve incrementar esse ponteiro, mostrar o valor que ele “vê” (o conteúdo do local apontado) como número.
  3. 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, 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, (p + 1) = p + 1 times sizeof(int)
    ou seja, p++ anda exatamente o tamanho de um int.

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 que p carrega.

Passo 4

Incrementar o ponteiro:
p++;
Teoria: p++ faz
(p + 1) = endereço(p) + 1 times sizeof(int),ç
passando 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;
}

Exercícios relacionados