Linguagem C: Curso Completo
Find a file
2026-02-15 14:21:42 -03:00
LICENSE Initial commit 2026-02-14 20:15:04 -03:00
README.org programação completa 2026-02-15 14:21:42 -03:00

Linguagem C: Curso Completo

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 fork e exec
  • 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

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

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, union e enum
  • Inicialização composta
  • Ponteiros para struct e union
  • 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 para FILE (open e fopen)
  • Efeitos na bufferização do espaço do usuário
  • Conversão entre descritores e fluxos (fdopen e fileno)
  • Fechamento de recursos (close e fclose)

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, fgetc e getchar
  • A função scanf e 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 (open e fopen)
  • Estágio 2: Processamento
  • Estágio 3: Fechamento (close e fclose)

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 make e Makefile

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 (errno e strerror)

70 - Preparando mensagens para tradução

  • Mensagens interativas (prompts e erros)
  • A função gettext
  • A macro _()
  • Cuidados com printf e 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 signal e sigaction
  • Tratamento de SIGINT e SIGTERM
  • 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