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++
#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;
}
row 0=6
row 1=15
#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';
}
}
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.
A posse e a liberação da memória ficam totalmente por conta do programador.
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.
- Row Sums Add up every row of a grid. Fácil
- Minesweeper Neighbor Counts Annotate a rectangular board. Médio