Pular para conteúdo

Aula 10 – Ponteiros (Introdução) 🧠

Ponteiros são considerados o "terror" de muitos estudantes de C, mas na verdade eles são ferramentas extremamente simples e poderosas. Um Ponteiro é apenas uma variável que guarda o Endereço de Memória de outra variável.


📍 1. Endereço de Memória vs Valor

Toda variável que você cria ocupa um lugar físico na memória RAM do computador. Esse lugar tem um número de identificação, chamado de Endereço.

  • Valor: O que está dentro da "caixa" (ex: 42).
  • Endereço: Onde a "caixa" está na prateleira (ex: 0xFF01).

🏗️ 2. Operadores de Ponteiro

Existem dois símbolos fundamentais que você deve decorar:

  1. & (E comercial / Ampersand): Significa "Endereço de". Usado para descobrir onde a variável mora.
  2. * (Asterisco): Quando usado na declaração, indica um ponteiro. Quando usado no código, significa "Conteúdo de" (aponta para o valor dentro do endereço).

Exemplo Base:

#include <stdio.h>

int main() {
    int v = 10;
    int *p; // Declarando um ponteiro para inteiro

    p = &v; // p agora guarda o ENDEREÇO de v

    printf("Valor de v: %d\n", v);
    printf("Endereço de v: %p\n", &v); // %p para endereços
    printf("Valor apontado por p: %d\n", *p);

    return 0;
}

🛠️ 3. Por que usar Ponteiros?

Você pode se perguntar: "Por que não usar a variável direto?". Ponteiros são essenciais para: - Passagem por Referência: Permitir que uma função mude o valor de uma variável que está fora dela. - Alocação Dinâmica: Criar vetores que crescem ou diminuem durante o programa. - Estruturas Complexas: Como listas encadeadas e árvores (base de grandes softwares).


💻 Exemplo Prático: Trocando Valores

Lembram do exercício de trocar A por B? Com funções e ponteiros, podemos fazer isso de forma elegante:

void trocar(int *a, int *b) {
    int aux = *a;
    *a = *b;
    *b = aux;
}

int main() {
    int x = 5, y = 10;
    trocar(&x, &y); // Enviamos o endereço!
    printf("x=%d, y=%d", x, y); // Saída: x=10, y=5
    return 0;
}

🚀 Mini-Projeto da Aula: "Inspetor de Memória"

Objetivo: Criar um programa que peça para o usuário digitar um valor, e o programa mostre um relatório completo: o valor, o endereço de memória e o tamanho em bytes que aquela variável ocupa (use sizeof).


📝 Exercícios de Fixação

  1. Crie um ponteiro para um float, atribua um valor a uma variável e use o ponteiro para dobrar esse valor original.
  2. O que acontece se você tentar imprimir p em vez de *p no printf? Teste e observe o resultado.
  3. Desafio: Tente criar um "Ponteiro para Ponteiro" (int **pp) e veja se consegue acessar o valor original através dele.

Próxima Aula: Ponteiros e Arrays