Arrays Unidimensionais em Linguagem C — declaração, inicialização, strings e aplicações embarcadas.
Objectivos
Ao final desta aula, o estudante deverá ser capaz de:
Introdução
Estrutura de dados que armazena uma sequência de elementos do mesmo tipo, acessíveis por índice numérico, em posições contíguas de memória.
vetor[índice]int num[5]; // Vetor de 5 inteiros
Memória:
+------+------+------+------+------+
|num[0]|num[1]|num[2]|num[3]|num[4]|
+------+------+------+------+------+
Motivação
Grandes quantidades de dados do mesmo tipo sem declarar várias variáveis.
Facilita a manipulação de dados através de loops.
Ordenação, busca, médias e outras operações.
Leituras de sensores, buffers, tabelas para displays.
Declaração
Sintaxe: <tipo> nomeVetor[numeroDeElementos];
int idades[10]; // 10 inteiros
float temperaturas[5]; // 5 floats
char nome[20]; // 20 caracteres (string)
#define para definir o tamanho:#define TAM 10
int vetor[TAM];
Inicialização
int num[5] = {10, 20, 30, 40, 50};
float notas[3] = {7.5, 8.0, 9.2};
char vogais[5] = {'a', 'e', 'i', 'o', 'u'};
int num[] = {10, 20, 30}; // Compilador conta: 3 elementos
Inicialização
int num[5] = {10, 20};
// num[0]=10, num[1]=20, num[2..4]=0 (preenchidos com zero)
int num[5] = {0}; // Todos os elementos valem 0
Acesso
int num[5] = {10, 20, 30, 40, 50};
int x = num[2]; // x = 30
num[4] = 100; // Altera o 5º elemento para 100
int i;
int num[5] = {10, 20, 30, 40, 50};
for (i = 0; i < 5; i++) {
printf("num[%d] = %d\n", i, num[i]);
}
Exemplo
#define TAM 5
int valores[TAM] = {10, 20, 30, 40, 50};
int soma = 0;
float media;
int i;
for (i = 0; i < TAM; i++) {
soma += valores[i];
}
media = (float)soma / TAM;
printf("Média: %.2f\n", media);
(float)soma força a divisão com casas decimais. Sem ele, a divisão seria inteira.
Strings
Em C, uma string é um vetor de char terminado pelo caractere nulo '\0'.
char nome[10] = "Jose";
// Ocupa 5 posições: 'J', 'o', 's', 'e', '\0'
char msg[] = "Bom dia"; // Tamanho 8 (7 chars + '\0')
char nome[10] = "Ana"; // 10 posições, só 4 usadas
char vazio[20] = ""; // String vazia
Exemplo
char msg[] = "Hello World";
int i = 0;
while (msg[i] != '\0') {
lcdChar(msg[i]); // Função hipotética para display LCD
i++;
}
printf("%s", msg) ou puts(msg) para imprimir strings directamente.
Aplicação 1
#define AMOSTRAS 10
int leituras[AMOSTRAS];
int i;
for (i = 0; i < AMOSTRAS; i++) {
leituras[i] = adRead(0); // Lê canal 0 do ADC
timerDelay(100); // Aguarda 100 ms
}
Aplicação 2
Usado para armazenar dados temporariamente — típico em comunicação serial.
#define TAM_BUFFER 10
char buffer[TAM_BUFFER];
int inicio = 0, fim = 0;
void adicionaBuffer(char dado) {
buffer[fim] = dado;
fim = (fim + 1) % TAM_BUFFER;
}
char removeBuffer(void) {
char dado = buffer[inicio];
inicio = (inicio + 1) % TAM_BUFFER;
return dado;
}
% faz o índice "dar a volta" — quando chega ao fim, volta ao início.
Aplicação 3
const char conv[16] = {
0xD7, // 0
0x11, // 1
0xCD, // 2
0x5D, // 3
0x1B, // 4
0x5E, // 5
0xDE, // 6
0x15, // 7
0xDF, // 8
0x5F, // 9
0x9F, // A
0xDA, // b
0xC6, // C
0xD9, // d
0xCE, // E
0x8E // F
};
void displayDigit(char pos, char valor) {
soWrite(conv[valor]);
digitalWrite(pos, HIGH);
}
Aplicação 4
#define N 5
int amostras[N] = {0};
int soma = 0;
int i;
int filtroMedia(int novaAmostra) {
soma -= amostras[0];
for (i = 0; i < N - 1; i++) {
amostras[i] = amostras[i + 1];
}
amostras[N - 1] = novaAmostra;
soma += novaAmostra;
return soma / N;
}
Exemplo
#include "lcd.h"
#include "ad.h"
#define TAM 5
void main(void) {
int valores[TAM];
int i, soma = 0;
lcdInit();
adInit();
for (i = 0; i < TAM; i++) {
valores[i] = adRead(2);
lcdPosition(0, i*3);
lcdNumber(valores[i]);
timerDelay(500);
}
for (i = 0; i < TAM; i++) {
soma += valores[i];
}
lcdPosition(1, 0);
lcdString("Media: ");
lcdNumber(soma / TAM);
for (;;);
}
Exemplo
#include "io.h"
const char padroes[8] = {
0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80
};
void main(void) {
int i;
systemInit();
for (;;) {
for (i = 0; i < 8; i++) {
ioWrite(padroes[i]);
timerDelay(200);
}
}
}
const coloca o vetor em memória de programa — poupa RAM preciosa em microcontroladores.
Prática
Cria um vetor de 10 inteiros, inicializa com 1 a 10 e imprime todos.
Lê 8 temperaturas num vetor. Calcula e exibe média e maior valor.
Cria um vetor de 6 elementos e imprime-os na ordem inversa.
Vetor de 20 inteiros. Pede um número e verifica se existe (indica posição ou "não encontrado").
Cria um vetor de char com teu nome e imprime cada caractere numa linha do LCD.
Implementa buffer circular de 10 posições para caracteres da serial.
Usa a tabela de conversão e exibe 0-9 sequencialmente.
Filtro de média móvel N=5 para suavizar leitura de sensor analógico.
Resumo
char terminados em '\0'
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.