Matrizes em Linguagem C — declaração, inicialização, loops aninhados e aplicações em sistemas embarcados.
Objectivos
Ao final desta aula, o estudante deverá ser capaz de:
Introdução
Estrutura de dados que organiza elementos do mesmo tipo em linhas e colunas. Podemos imaginá-la como uma tabela:
int mat[3][4]; // 3 linhas e 4 colunas
Col0 Col1 Col2 Col3
Lin0 [0][0] [0][1] [0][2] [0][3]
Lin1 [1][0] [1][1] [1][2] [1][3]
Lin2 [2][0] [2][1] [2][2] [2][3]
mat[linha][coluna]. Os índices começam sempre em 0.
Motivação
Notas de alunos, coordenadas, etc.
Matriz de pixels (tons de cinza ou RGB).
Teclados matriciais — linhas × colunas.
Matrizes 8×8 ou maiores, com multiplexação.
Amostras de múltiplos sensores ao longo do tempo.
Multiplicação, transposta, sistemas lineares.
Declaração
Sintaxe: <tipo> nomeMatriz[linhas][colunas];
int mat[3][4]; // 3 linhas, 4 colunas (12 inteiros)
float temperaturas[2][5]; // 2 linhas, 5 colunas (10 floats)
char tabuleiro[8][8]; // 8×8 caracteres
#define LINHAS 3
#define COLUNAS 4
int mat[LINHAS][COLUNAS];
Inicialização
int mat[2][3] = {1, 2, 3, 4, 5, 6};
// Equivale a:
// mat[0][0]=1, mat[0][1]=2, mat[0][2]=3
// mat[1][0]=4, mat[1][1]=5, mat[1][2]=6
int mat[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
Inicialização
int mat[3][3] = {
{1, 2}, // linha 0: 1, 2, 0
{4, 5, 6}, // linha 1: 4, 5, 6
{7} // linha 2: 7, 0, 0
};
int mat[3][3] = {0}; // Todos os elementos valem 0
int mat[][3] = {
{1, 2, 3},
{4, 5, 6}
}; // Compilador conta: 2 linhas
Acesso
int mat[2][3] = {{1,2,3},{4,5,6}};
int x = mat[1][2]; // x = 6
mat[0][1] = 20; // Altera linha 0, coluna 1
#define LINHAS 2
#define COLUNAS 3
int mat[LINHAS][COLUNAS] = {{1,2,3},{4,5,6}};
int i, j;
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
printf("mat[%d][%d] = %d\n", i, j, mat[i][j]);
}
}
mat[2][3] numa matriz 2×3) causa comportamento indefinido — pode corromper memória.
Memória
Em C, matrizes são armazenadas em ordem row-major (linha por linha): primeiro a linha 0, depois a linha 1, etc.
int mat[2][3]; // 6 inteiros contíguos
Endereço base → [0][0] [0][1] [0][2] [1][0] [1][1] [1][2]
mat[i][j]:base + (i * num_colunas + j) * sizeof(tipo)
Memória
Matrizes grandes consomem muita RAM. Em microcontroladores com poucos KB, isto é crítico.
int mat[10][10] → 100 inteiros → 200–400 bytesfloat mat[10][10] → 100 floats → 400 bytes2 KB de SRAM. Uma única matriz float[10][10] ocupa 10% da RAM total.
const para matrizes que não mudam — vão para a memória de programa. Prefere tipos menores (char, int16) quando possível.
Exemplo 1
#include <stdio.h>
#define LINHAS 3
#define COLUNAS 4
int main(void) {
int mat[LINHAS][COLUNAS];
int i, j;
// Preencher
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
mat[i][j] = i * COLUNAS + j;
}
}
// Imprimir como tabela
for (i = 0; i < LINHAS; i++) {
for (j = 0; j < COLUNAS; j++) {
printf("%3d ", mat[i][j]);
}
printf("\n");
}
return 0;
}
Exemplo 2
#define N 3
int A[N][N], B[N][N], C[N][N];
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
Exemplo 3
#define L 2
#define C 3
int mat[L][C] = {{1,2,3},{4,5,6}};
int transposta[C][L];
int i, j;
for (i = 0; i < L; i++) {
for (j = 0; j < C; j++) {
transposta[j][i] = mat[i][j];
}
}
T[j][i] = M[i][j].
Exemplo 4
Dadas A (m × n) e B (n × r), o produto C (m × r) é calculado com três loops aninhados:
#define M 2
#define N 3
#define R 2
int A[M][N] = {{1,2,3},{4,5,6}};
int B[N][R] = {{7,8},{9,10},{11,12}};
int C[M][R];
int i, j, k;
for (i = 0; i < M; i++) {
for (j = 0; j < R; j++) {
C[i][j] = 0;
for (k = 0; k < N; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
Aplicação 1
Teclados matriciais organizam teclas em linhas e colunas. O microcontrolador faz uma varredura: activa uma linha e lê as colunas.
#define LINHAS 2
#define COLUNAS 5
char teclas[LINHAS][COLUNAS] = {
{'1','2','3','4','5'},
{'A','B','C','D','E'}
};
char lerTeclado(void) {
int i, j;
for (i = 0; i < LINHAS; i++) {
// Ativa linha i, desativa as demais
for (j = 0; j < COLUNAS; j++) {
if (digitalRead(coluna[j]) == HIGH) {
return teclas[i][j];
}
}
}
return 0; // Nenhuma tecla
}
Aplicação 2
Uma matriz de LEDs (ex.: 8×8) é controlada por linhas e colunas. Para exibir um padrão, guarda-se uma matriz de bits.
const char imagem[8][8] = {
{0,0,0,1,1,0,0,0},
{0,0,1,1,1,1,0,0},
{0,1,1,0,0,1,1,0},
{0,1,1,0,0,1,1,0},
{0,0,1,1,1,1,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
Aplicação 3
Imagens em tons de cinza podem ser representadas por uma matriz de pixels. Filtros como média, bordas, etc., percorrem a matriz com loops aninhados.
#define LARGURA 320
#define ALTURA 240
unsigned char imagem[ALTURA][LARGURA];
// Exemplo: filtro de média 3x3
unsigned char media3x3(int y, int x) {
int soma = 0;
int i, j;
for (i = -1; i <= 1; i++)
for (j = -1; j <= 1; j++)
soma += imagem[y + i][x + j];
return soma / 9;
}
Aplicação 4
Armazena leituras de múltiplos sensores ao longo do tempo.
#define SENSORES 4
#define AMOSTRAS 100
int dados[SENSORES][AMOSTRAS];
// Exemplo: ler 4 sensores, 100 vezes
int s, a;
for (a = 0; a < AMOSTRAS; a++) {
for (s = 0; s < SENSORES; s++) {
dados[s][a] = adRead(s);
}
timerDelay(100);
}
Cuidados
Usa char ou int16_t quando possível.
Variáveis locais vão para a pilha — que é pequena.
constMatrizes constantes vão para memória de programa.
floatMatrizes de float são especialmente custosas em RAM.
Prática
Matriz 3×3 preenchida com 1 a 9, impressa como tabela.
Lê duas matrizes 3×3 e exibe a soma.
Matriz 4×4 e exibe a sua transposta.
Multiplica uma matriz 2×3 por uma 3×2.
Matriz 5×5: calcula a média e conta quantos elementos são maiores que ela.
Adapta a varredura para teclado 4×4 (linhas bits 0–3, colunas bits 4–7 da Porta B).
Cria um padrão de coração numa matriz 8×8.
Armazena 10 leituras de 3 sensores (matriz 3×10). Calcula média por sensor e exibe no LCD.
Resumo
mat[i][j]const sempre que possívelstruct)
Referências
ASCENCIO, Ana F. G.; VENERUCH, Edilene A.
Fundamentos da Programação de Computadores. 3. ed. Pearson, 2014.
ALMEIDA, Rodrigo M. A.; MORAES, Carlos H. V.; SERAPHIM, Thatyana F. P.
Programação de Sistemas Embarcados. Elsevier, 2016. (Cap. 5 — Estruturas Compostas)
Material do ISPSongo — Plano Analítico de Introdução à Programação em C.
Bons estudos e boa programação em C.