Online C Compiler
Abrir no compilador

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.

Abrir no compilador

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 compilador

Saí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.