Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

C Memória Básico

Ponteiros

Um ponteiro é uma variável que guarda um endereço de memória. Em vez de armazenar um valor como int x = 10, um ponteiro como int *p armazena onde esse valor está. O operador & obtém o endereço de uma variável, e o operador * (desreferência) acessa o valor guardado naquele endereço.

Ponteiros são a base de arrays em C: o nome de um array "decai" para um ponteiro para o primeiro elemento. Por isso v[i] é equivalente a *(v + i). Essa equivalência abre espaço para a aritmética de ponteiros, em que somar 1 a um ponteiro avança para o próximo elemento do tipo apontado, não para o próximo byte.

Um ponteiro que não aponta para lugar nenhum deve ser nulo (NULL). Desreferenciar um ponteiro nulo é comportamento indefinido e geralmente causa falha de segmentação. Sempre inicialize ponteiros e verifique if (p != NULL) antes de usá-los.

Pontos-chave

  • &x devolve o endereço de x; *p acessa o valor no endereço guardado em p.
  • Um ponteiro nulo (NULL) não aponta para nada e não deve ser desreferenciado.
  • O nome de um array decai para um ponteiro para seu primeiro elemento.
  • v[i] é equivalente a *(v + i); a aritmética avança em elementos, não em bytes.
  • p + 1 anda sizeof(*p) bytes na memória.
ponteiros.c
#include <stdio.h>

int main(void) {
    int x = 42;
    int *p = &x;            /* p guarda o endereco de x */

    printf("x = %d\n", x);
    printf("*p = %d\n", *p); /* desreferencia: le o valor em x */

    *p = 100;               /* altera x atraves do ponteiro */
    printf("x apos *p = 100: %d\n", x);

    int v[4] = {10, 20, 30, 40};
    int *q = v;             /* v decai para &v[0] */

    for (int i = 0; i < 4; i++) {
        /* *(q + i) e o mesmo que v[i] */
        printf("v[%d] = %d\n", i, *(q + i));
    }

    int *nulo = NULL;
    if (nulo == NULL) {
        printf("ponteiro nulo: nao pode ser desreferenciado\n");
    }
    return 0;
}

Exercícios

  1. 1
    Fácil

    Dobrar um valor com ponteiro

    Escreva um programa que declare int numero = 7; e um ponteiro para ele. Use o ponteiro para dobrar o valor de numero e imprima o resultado.

    Resolver
  2. 2
    Médio

    Somar elementos de um array com aritmética de ponteiros

    Dado o array int v[5] = {3, 8, 1, 7, 4};, calcule a soma dos elementos usando apenas aritmética de ponteiros, sem usar v[i]. Imprima a soma.

    Resolver
  3. 3
    Desafio

    Inverter array in-place com dois ponteiros

    Escreva uma função void inverter(int *v, int n) que inverta os elementos de um array in-place, usando dois ponteiros (um do início, outro do fim). No main, aplique ao array {1, 2, 3, 4, 5} e imprima o resultado separado por espaços.

    Resolver

Continue estudando