Ponteiros e memória

Arrays multidimensionais em C e C++

Nesta lição, você vai percorrer uma matriz bidimensional e somar os elementos de cada linha.

Introdução

Um array bidimensional pode ser imaginado como uma tabela de linhas e colunas. Em C e C++, ele é guardado de forma contínua na memória, linha por linha (row-major): a primeira linha inteira vem antes, depois a segunda, e assim por diante.

Pontos importantes

  • Um ponteiro só deve apontar para um objeto que ainda existe, do tipo certo, ou ser nulo.
  • Cada área de memória alocada deve ser liberada exatamente uma vez.
  • Deixe claro qual função é dona da memória (ownership) e quais dados são apenas lidos (const).

Veja como funciona

Aponte para uma célula para ver sua linha, sua coluna e onde ela fica na memória, onde todas as linhas são guardadas uma após a outra.

Exemplos de código C e C++

C
Executar →
main.c
#include <stdio.h>

int main(void) {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int row = 0; row < 2; ++row) {
        int total = 0;
        for (int column = 0; column < 3; ++column) total += matrix[row][column];
        printf("row %d=%d\n", row, total);
    }
    return 0;
}
Resultado da execução
row 0=6
row 1=15
C++
Executar →
main.cpp
#include <array>
#include <iostream>

int main() {
    std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
    for (std::size_t row = 0; row < matrix.size(); ++row) {
        int total = 0;
        for (int value : matrix[row]) total += value;
        std::cout << "row " << row << '=' << total << '\n';
    }
}
Resultado da execução
row 0=6
row 1=15

Comparação entre C e C++

Dois laços aninhados percorrem a matriz: o externo passa por cada linha e o interno soma os elementos dessa linha na variável total. Em C, ao passar um array bidimensional para uma função, é preciso informar o tamanho de todas as dimensões, exceto a primeira. Em C++, std::array guarda o tamanho no próprio tipo e tem o método at(), que verifica se o índice é válido.

C

A posse e a liberação da memória ficam totalmente por conta do programador.

C++

Contêineres e RAII liberam os recursos automaticamente quando o objeto chega ao fim da vida.

Exercícios práticos

Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.

  • Teste ponteiros nulos e falhas na alocação de memória.
  • Execute o programa com AddressSanitizer e UndefinedBehaviorSanitizer para encontrar erros de memória.
  • Anote claramente qual ponteiro é dono da memória e qual só serve para leitura.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios