Edição didática em português. O código e suas saídas preservam o original.
Ponteiros em C
Aprenda a obter endereços, desreferenciar ponteiros e respeitar os limites e a duração dos objetos.

Um ponteiro armazena um endereço com um tipo associado. O operador & obtém o endereço de um objeto e * permite acessar o objeto apontado. Antes de desreferenciar, confirme que o ponteiro aponta para um objeto válido, com tipo e duração adequados.
A aritmética de ponteiros avança em unidades do tipo apontado. Em um array, é possível formar um ponteiro até uma posição após o último elemento, mas não desreferenciar essa posição. Subtrações e comparações de ordem devem respeitar as regras para objetos de um mesmo array.
Passar um ponteiro copia seu valor. Essa cópia permite modificar o objeto original, mas alterar a cópia não modifica o ponteiro do chamador. Para atualizá-lo, retorne o novo ponteiro ou receba um ponteiro para ponteiro.
Inicialize os ponteiros, verifique alocações e evite acessos após free. Desenhar os objetos e as setas entre eles ajuda a entender listas, arrays de ponteiros e mudanças nos encadeamentos.
Código C
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main(void) {
int score = 95;
int *ptr = &score;
printf("Value via ptr : %d\n", *ptr);
*ptr = 100;
printf("Updated score : %d\n", score);
int nums[4] = {10, 20, 30, 40};
int *p = nums;
for (int i = 0; i < 4; i++) {
printf("*(p + %d) = %d\n", i, *(p + i));
}
printf("Bytes between p and p + 1: %zu\n",
(size_t)((char *)(p + 1) - (char *)p));
int x = 1, y = 2;
swap(&x, &y);
printf("After swap: x = %d, y = %d\n", x, y);
int *heap = malloc(3 * sizeof(int));
if (heap == NULL) {
return 1;
}
for (int i = 0; i < 3; i++) {
heap[i] = (i + 1) * 5;
}
printf("Heap values: %d %d %d\n", heap[0], heap[1], heap[2]);
free(heap);
heap = NULL;
printf("heap is %s after free\n", heap == NULL ? "NULL" : "not NULL");
return 0;
}
Abrir no compiladorSaída esperada
Value via ptr : 95 Updated score : 100 *(p + 0) = 10 *(p + 1) = 20 *(p + 2) = 30 *(p + 3) = 40 Bytes between p and p + 1: 4 After swap: x = 2, y = 1 Heap values: 5 10 15 heap is NULL after free
Perguntas frequentes
Por que o código e a saída continuam em inglês?
Palavras-chave, identificadores e textos verificados pelos testes são preservados para não alterar o programa. As explicações e os controles estão traduzidos.