| LICENSE | ||
| README.org | ||
Linguagem C: Curso Completo
- Sobre o curso
- Como apoiar
- Conteúdo previsto
- 1: Introdução
- 2: Criação e execução de programas
- 3: Variáveis e ponteiros
- 4: Outros tipos de dados
- 5: Classes de armazenamento
- 6: Estruturas de controle
- 7: Vetores
- 8: Strings
- 9: Interface de linha de comando
- 10: Alocação dinâmica de memória
- 11: Modelagem de estruturas de dados
- 12: Modelagem de comportamento (function pointers)
- 13: Entrada e saída de dados
- 14: Leitura da entrada padrão
- 15: Trabalhando com arquivos
- 16: Organização de projetos
- 17: Metaprogramação com o pré-processador
- 18: Internacionalização
- 19: Configurações e extensibilidade
- 20: Extras
Sobre o curso
Este curso completo da linguagem C será publicado a partir de 3 de março a 8 de dezembro de 2026. O objetivo é abordar, pelo menos, todos os 80 tópicos listados abaixo.
O acesso aos vídeos das aulas, bem como às respectivas anotações e exemplos neste repositório, será público e gratuito, graças às pessoas que estão apoiando meu trabalho. Em contrapartida, todas essas pessoas apoiadoras terão acesso a um laboratório ao vivo, que acontecerá quinzenalmente pelo Jitsi, num total de 20 laboratórios, onde poderemos estudar e praticar os tópicos dos vídeos.
Como apoiar
Se quiser me ajudar a realizar este ambicioso projeto, envie um pix de qualquer valor para pix@blauaraujo.com
Se estiver no exterior, use o meu link de doações pelo PayPal.
Em seguida, mande um e-mail para cursos@blauaraujo.com anexando o comprovante da sua contribuição — isso é importante para que eu possa enviar os links dos laboratórios ao vivo, a que todo mundo que contribuir terá acesso.
IMPORTANTE!
Independente das contribuições para a realização do curso, todos os apoiadores ativos no Apoia.se e membros do canal @debxp, no YouTube, terão acesso aos laboratórios.
Conteúdo previsto
A produção deste conteúdo levará cerca de 20 semanas, terminando por volta de 20 de julho de 2026. Mas, como cada aula é dividida em 4 vídeos, lançados às terças e quintas (dois por semana), as publicações irão de 3 de marco a 8 de dezembro de 2026.
1: Introdução
1 - Conceitos básicos
- O que é um programa de computador
- O que é uma linguagem de programação
- Especificações e implementações
- Interpretadores e compiladores
- Gerações e níveis de abstração
2 - Características da linguagem C
- Alto nível de terceira geração (3GL)
- Implementada como um compilador
- Imperativa
- Procedural
3 - Implementação em ambientes Unix e GNU/Linux
- Compiladores (
cc/gcc) - Biblioteca de chamadas de sistema (
man 2) - Biblioteca padrão de funções (
man 3)
4 - Exemplo de um programa em C (salve.c)
- Salve, simpatia!
- Compilação
- Execução
2: Criação e execução de programas
5 - Do que programas são feitos
- Dados e instruções
- Variáveis, endereços e registradores
- Sub-rotinas e funções
- Ponto de entrada
6 - Como programas são executados
- Sistemas operacionais Unix-like
- Chamadas de sistema
forkeexec - Processos
- Estados de término
7 - Mapeamento de memória
- Segmento de código
- Segmentos de dados
- Pilha
- Área de alocação dinâmica
8 - Como o compilador gera executáveis
- Pré-processamento
- Objetos relocáveis
- Objetos compartilhados
- Edição de ligações
- Arquivo executável
3: Variáveis e ponteiros
9 - Tipos de dados primitivos
- O que são tipos
- O operador
sizeof - Tipo
char(1 byte) - Tipo
int(4 bytes em x86_64) - Tipo
float(precisão simples - 4 bytes em x86_64) - Tipo
double(precisão dupla - 8 bytes em x86_64) - Tipo
void(ausência de tipo/valor) - Tipo "ponteiro para …"
- Tipo
bool
10 - Declaração e definição de variáveis
- O que é uma variável
- Declaração
- Atribuição
- Inicialização
- Acesso
11 - Propriedades das variáveis
- Identificação (nome)
- Endereço na memória
- Espaço ocupado na memória (tipo)
- Escopo e tempo de vida
12 - Ponteiros
- Ponteiros são variáveis
- Operadores de referência (
&) e derreferência (*) - Aritmética de ponteiros
4: Outros tipos de dados
13 - Tipos compostos
- Enumeradores (
enum) - Agregados homogêneos (vetores)
- Agregados heterogêneos (
struct) - Agregados heterogêneos sobrepostos (
union)
14 - Especificadores de tipos
- Especificador
short(≤int, ≥ 2 bytes) - Especificador
unsigned(sem sinal) - Especificador
long(pelo menos 4 bytes)
15 - Qualificadores de tipo
- Qualificador
const(objeto não modificável) - Qualificador
volatile(acessos não otimizáveis) - Qualificador
restrict(único meio de acesso)
16 - Organização e conversão de tipos
- Apelidos para tipos (
typedef) - Expressões constantes e seus tipos
- Modelagem de tipos (type casting)
5: Classes de armazenamento
17 - Hierarquia de memória
- Registradores
- Cachês
- Memória principal (RAM)
- Memória de massa
18 - Formato de executáveis ELF
- Especificações gerais
- Seções do arquivo
- Utilitário
readelf - Utilitário
nm - Utilitário
ldd
19 - Uso da memória principal
- Tabelas de seções e segmentos
- Tabela de símbolos
- Instruções do programa
- Dados globais estáticos
- Alocação dinâmica
- Pilha de funções
20 - Regras de armazenamento de objetos
- Classe
auto - Classe
static - Classe
extern - Classe
register
6: Estruturas de controle
21 - Estruturas de repetição
- Laço
for - Laço
while - Laço
do..while
22 - Estrutura de decisão
- Estrutura
if..else if..else
23 - Estrutura de seleção
- Estrutura
switch..case
24 - Expressão condicional
- Expressão
condição ? true : false
7: Vetores
8: Strings
29 - O conceito de string em C
- Vetores de caracteres
- A tabela ASCII (
man ascii) - Caractere terminador (
'\0') - Strings literais expressam endereços
30 - Formatação de strings
- Impressão de strings no terminal (
printf) - Envio de strings formatadas para arquivos (
fprintf) - Concatenação de strings com formatação (
snprintf) - Reutilizando listas de argumentos (
va_list)
31 - Funções para manipulação de strings
- Determinando o comprimento (
strlen) - Fatiando strings (
strtok) - Localizando caracteres (
strchr) - Localizando substrings (
strstr) - Comparando strings (
strcmp) - Copiando strings (
strcpy) - Concatenando strings (
strcat)
9: Interface de linha de comando
33 - A filosofia UNIX e a linha de comandos
- Anatomia de um comando simples
- Argumentos
- Ambiente
- Redirecionamentos
34 - Parâmetros da função main
- Quantidade de argumentos
- Vetor de argumentos
- Vetores de strings
35 - Dados de ambiente
- Formato dos dados no ambiente (
NOME=VALOR) - O parâmetro POSIX
envp - Acesso direto com o vetor global
environ - Consulta de valores com
getenv
36 - Conversão de strings para números
- Funções que devem ser evitadas
- Conversão de strings para tipos inteiros
- Conversão de strings para tipos de ponto flutuante
10: Alocação dinâmica de memória
40 - Depuração de erros de alocação
- Erros comuns e vazamentos de memória
- O utilitário
valgrind
11: Modelagem de estruturas de dados
41 - Enumerações (enum)
- Conjunto de constantes inteiras
- Associação de valores
- Declaração de tipos enumerados
- Uso em expressões e na estrutura
switch
42 - Agregados heterogêneos (struct)
- Declaração de estruturas
- Definição e acesso aos membros
- Declaração de tipos
struct - Alinhamento e preenchimento (padding)
- Estruturas aninhadas
- Vetores de estruturas
- Estruturas e funções
43 - Agregados heterogêneos sobrepostos (union)
- Sobreposição de memória
- Declaração e acesso aos membros
- Declaração de tipos
union - Usos típicos
- Empacotamento de dados em campos de bits
44 - Composição e manipulação de estruturas
- Combinando
struct,unioneenum - Inicialização composta
- Ponteiros para
structeunion - Acesso indireto a membros (
->) - Passagem de estruturas para funções
- Alocação dinâmica de estruturas
12: Modelagem de comportamento (function pointers)
45 - Ponteiros para funções
- Declaração de ponteiros para funções
- Compatibilidade de tipos
- Atribuição e chamada indireta
46 - Ponteiros para funções como parâmetros
- Passagem de funções como argumento
- Funções de ordem superior
- Separação entre algoritmo e comportamento
47 - Tabelas de funções
- Vetores de ponteiros para funções
- Seleção dinâmica de comportamento
- Implementação de despachantes
48 - Callbacks e integração com dados
- Ponteiros para funções em estruturas
- Estratégias e extensibilidade
- Padrões simples de callback
13: Entrada e saída de dados
49 - Tabela de descritores de arquivos
- Fluxos de dados padrão
- Uma nota sobre dispositivos
- Representação em /proc
50 - Redirecionamentos e pipes
- De volta à filosofia UNIX
- Redirecionamentos
- Pipes (anônimos)
- Arquivos FIFO (pipes nomeados)
51 - Bufferização
- Modos de bufferização
- Buffer de saída do programa
- Buffer de entrada do programa
- Entrada padrão não bufferizada
52 - Fluxos (stream) e descritores de arquivos
- A interface do kernel e as abstrações da
libc - Inteiro (
int) e ponteiro paraFILE(openefopen) - Efeitos na bufferização do espaço do usuário
- Conversão entre descritores e fluxos (
fdopenefileno) - Fechamento de recursos (
closeefclose)
14: Leitura da entrada padrão
53 - Leitura interativa e não interativa
- Quem está na entrada padrão (
isatty) - Descarga do buffer de saída (
fflush) - Descarga do buffer de entrada
54 - Leitura em baixo nível
- Chamada de sistema
read - Leitura parcial e valor de retorno
- Fim de arquivo e erros
55 - Leitura em alto nível
- Leitura orientada a caractere e a linha
- Funções
fgets,fgetcegetchar - A função
scanfe seus problemas - Leitura com alocação dinâmica (
getline)
56 - Erros, EOF e sinais na leitura
- Detecção de fim de arquivo
- Tratamento de erros
- Interrupções por sinal
15: Trabalhando com arquivos
57 - Procedimento geral de acesso a arquivos
- Estágio 1: Abertura (
openefopen) - Estágio 2: Processamento
- Estágio 3: Fechamento (
closeefclose)
58 - Modos de abertura de arquivos
- Leitura
- Escrita
- Append
- Leitura e escrita
59 - Posicionamento e acesso aleatório
- Cursor de arquivo
- Reposicionamento (
lseek,fseek) - Obtenção da posição atual (
ftell) - Releitura e sobrescrita
60 - Metadados e estado de arquivos
- Tipo e tamanho
- Permissões e máscara (
umask) - Informações via
stat
16: Organização de projetos
61 - Considerações sobre arquiteturas
- O que é arquitetura de software
- Organização em módulos
- Coesão e acoplamento
- Separação de responsabilidades
62 - Separação entre interface e implementação
- Visibilidade de dados e funções
- Arquivos de cabeçalho (
.h) - Arquivos de implementação (
.c)
63 - Construção automatizada
- Compilação de múltiplos arquivos
- Dependências e recompilação
- Automação com scripts em shell
- Uso do
makeeMakefile
64 - Reutilização de código
- Criação de bibliotecas estáticas
- Criação de bibliotecas dinâmicas
- Uso de bibliotecas externas
- Organização para reutilização
17: Metaprogramação com o pré-processador
65 - Macros básicas
- Substituição textual
- Constantes simbólicas
66 - Macros parametrizadas
- Expansão
- Parênteses e precedência
- Avaliação múltipla
67 - Compilação condicional
#if,#ifdef,#ifndef- Controle de portabilidade
- Flags de depuração
68 - Recursos avançados
- Operadores
#e## - Macros variádicas
- Uso para logging
18: Internacionalização
69 - Imprimindo traduções de mensagens padrão
- Definindo a localidade do sistema (
setlocale) - Valor e texto das mensagens padrão (
errnoestrerror)
70 - Preparando mensagens para tradução
- Mensagens interativas (prompts e erros)
- A função
gettext - A macro
_() - Cuidados com
printfe placeholders
71 - Documentação não é código
- Separação entre lógica e interface textual
- Imprimindo ajuda e versão
- Páginas de manual (
man)
72 - Arquivos de tradução
- Arquivos
.po - Compilação para
.mo - Ferramentas para tradução (
xgettext)
19: Configurações e extensibilidade
73 - Usando arquivos de configuração
- Formatos simples (
chave=valor,ini) - Leitura e validação
- Configuração vs. compilação
74 - Extensões com scripts em shell
- Executando comandos externos com
system - Executando programas e capturando sua saída
- Comunicando-se com processos via pipe
- Cuidados de segurança na execução de comandos
75 - Integração com a linguagem Lua
- Incorporando o interpretador Lua
- Chamando funções Lua a partir de C
- Expondo funções C para Lua
- Gerenciamento do estado Lua
76 - Plugins em C
- Carregamento dinâmico (
dlopen) - Símbolos (
dlsym) - Convenções de interface
20: Extras
77 - Edição e histórico de digitação
- Uso da biblioteca
readline - Histórico de comandos digitados
78 - Opções de linha de comando
- Uso de
getopt - Opções curtas e longas
- Validação de argumentos
79 - Interceptação e tratamento de sinais
- O que são sinais
- Sinais ignoráveis e não ignoráveis
- Capturando sinais com
signalesigaction - Tratamento de
SIGINTeSIGTERM - Encerramento limpo e liberação de recursos
80 - Introdução à execução paralela em C
- Paralelismo com
fork - Compartilhamento e isolamento de memória
- Threads com
pthread_create - Espera de término com
pthread_join