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:
&(E comercial / Ampersand): Significa "Endereço de". Usado para descobrir onde a variável mora.*(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
- Crie um ponteiro para um
float, atribua um valor a uma variável e use o ponteiro para dobrar esse valor original. - O que acontece se você tentar imprimir
pem vez de*pnoprintf? Teste e observe o resultado. - Desafio: Tente criar um "Ponteiro para Ponteiro" (
int **pp) e veja se consegue acessar o valor original através dele.