Aula 00 – Introdução ao C e Configuração do Ambiente

Conheça a linguagem que está por trás de sistemas operacionais, compiladores e hardware

O que é a Linguagem C?

C é uma linguagem de programação de propósito geral criada por Dennis Ritchie entre 1969 e 1973 nos laboratórios Bell, nos Estados Unidos. Ela foi desenvolvida para criar o sistema operacional UNIX e rapidamente se tornou uma das linguagens mais influentes da história da computação.

Praticamente todas as linguagens modernas — Java, Python, JavaScript, C++, Rust — foram direta ou indiretamente influenciadas pela linguagem C. Aprender C é como aprender a "falar" com o computador de perto.

Principais características do C

C versus Java e Python

Característica C Java Python
Paradigma principal Procedural Orientado a Objetos Multi-paradigma
Compilação Compilada para código nativo Compilada para bytecode (JVM) Interpretada
Gerenciamento de memória Manual (malloc / free) Automático (Garbage Collector) Automático (GC)
Ponteiros Sim (explícito) Não (referências gerenciadas) Não
Desempenho Muito alto Alto Moderado
Uso típico SO, drivers, embarcados, jogos Back-end web, Android, corporativo Ciência de dados, scripts, web

C no Mercado de Trabalho

Apesar de ser uma linguagem de 1972, C continua sendo extremamente relevante em 2025. Sua presença é dominante em áreas onde desempenho e controle de hardware são críticos.

Sistemas Operacionais

~95%

do kernel do Linux e grandes partes do Windows e macOS são escritos em C

95%

Sistemas Embarcados

#1

C é a linguagem mais usada em microcontroladores e hardware embarcado no mundo

90%

Índice TIOBE

Top 3

C aparece consistentemente entre as 3 linguagens mais populares do mundo

Top 3

O Diferencial do C: controle de baixo nível com alta eficiência

Estruturas de dados são uma grande força do C, mas não é esse o diferencial único da linguagem. O diferencial mais marcante do C é outro:

C é a linguagem do controle, da eficiência e da proximidade com a máquina. Em nenhuma outra linguagem de uso geral você consegue combinar simplicidade de sintaxe com tanto poder de baixo nível.

Em outras palavras, C se destaca porque permite:

Capacidade O que isso significa na prática
Acesso direto à memória por ponteiros Você pode ler e escrever em endereços específicos de RAM — algo que Java, Python e JavaScript escondem completamente
Controle fino sobre alocação e liberação de memória malloc e free: você decide quando a memória é reservada e quando é devolvida ao sistema
Pouca "camada intermediária" entre código e hardware Não há máquina virtual (como a JVM do Java) nem garbage collector que pause o programa
Execução muito rápida O código C compilado é, em geral, próximo ao desempenho do Assembly — sem overhead de runtime
Base para construção de sistemas Compiladores, drivers, sistemas operacionais e bibliotecas são escritos em C porque a linguagem permite esse nível de controle

Onde C é usado — aplicações reais

Sistemas operacionais

Linux, macOS (kernel XNU), Windows NT — seus núcleos são escritos majoritariamente em C

Compiladores e interpretadores

GCC, Clang, o interpretador CPython (Python), o motor V8 (JavaScript) têm núcleos em C ou C++

Firmware e embarcados

Microcontroladores (Arduino, ESP32), sistemas automotivos, equipamentos médicos — C é a linguagem padrão

Bancos de dados

SQLite, PostgreSQL, MySQL — seus kernels de alto desempenho são implementados em C

Comparando as linguagens do curso

Linguagem Identidade principal Ponto forte
Java Orientação a objetos, ecossistema corporativo Portabilidade (JVM), robustez, produtividade em sistemas grandes
Python Produtividade, automação, ciência de dados, IA Sintaxe concisa, bibliotecas ricas, prototipagem rápida
JavaScript Interatividade web e aplicações full stack Onipresença no browser, ecosistema Node.js
C Desempenho, controle de memória, baixo nível Proximidade com o hardware, velocidade de execução, base de sistemas

E onde entram as estruturas de dados?

C é excelente para ensinar e implementar estruturas de dados porque nele você vê de forma explícita o que outras linguagens escondem:

Por isso C é muito usado em disciplinas de Estrutura de Dados e Algoritmos. Mas isso acontece porque a linguagem expõe bem os mecanismos internos — não porque ela "foi feita principalmente para estruturas de dados".

Em uma frase: Estruturas de dados são uma grande aplicação didática e prática do C, mas o maior diferencial da linguagem é a combinação única entre simplicidade da sintaxe + poder de baixo nível + eficiência próxima do hardware.

Outras linguagens ou escondem demais a memória, ou têm runtime pesado, ou sacrificam desempenho bruto, ou são mais complexas. C fica num ponto muito especial: simples o bastante para ser pequeno, poderoso o bastante para construir quase tudo fundamental.

Configuração do Ambiente de Desenvolvimento

Opção online (sem instalação): OnlineGDB

Para começar de forma rápida, sem instalar nada, use o OnlineGDB:

  1. Acesse: https://www.onlinegdb.com/online_c_compiler
  2. Selecione a linguagem C no menu superior direito.
  3. Digite seu código na área de edição.
  4. Clique em Run para compilar e executar.
DICA: O OnlineGDB permite inclusive usar o depurador (debugger) online, o que é ótimo para visualizar ponteiros e memória passo a passo.

Instalação local: WinLibs (MinGW-w64) + VS Code

Instalar o compilador (WinLibs – MinGW-w64)

Abra o site do WinLibs (distribuição pronta do MinGW-w64):

Pesquise por "WinLibs GCC MinGW-w64" — o domínio normalmente é winlibs.com

Baixe a versão UCRT + x86_64 (64-bit).

Extraia o ZIP para:

C:\mingw64\

Depois disso, o executável do compilador deve estar em:

C:\mingw64\bin\gcc.exe

Adicionar a pasta bin no PATH do Windows

  1. No Windows, pesquise: "Editar as variáveis de ambiente do sistema"
  2. Clique em Variáveis de Ambiente…
  3. Em "Variáveis do sistema", selecione Path → Editar
  4. Clique Novo e adicione:
C:\mingw64\bin

Confirme com OK → OK → OK.

Importante: Feche e reabra o VSCode depois disso para que ele enxergue o PATH atualizado.

Testar no terminal do VSCode

No VSCode: Terminal → New Terminal e execute:

gcc --version
g++ --version

Se aparecer a versão do compilador, está tudo certo:

gcc (MinGW-w64) 13.2.0 ou similar

Criar e compilar um programa C no VSCode

Crie um arquivo main.c com o seguinte conteúdo:

#include <stdio.h>

int main() {
    printf("Olá, C!\n");
    return 0;
}

Compile e rode no terminal integrado:

gcc main.c -o main
./main

No Windows, se necessário, execute diretamente:

main.exe

Deixar "Executar" com um atalho (opcional)

Para rodar seus programas C com um atalho de teclado no VSCode, instale a extensão Code Runner:

  1. Pressione Ctrl+Shift+X e pesquise "Code Runner"
  2. Instale a extensão (autor: Jun Han)
  3. Com o arquivo .c aberto, pressione Ctrl+Alt+N para compilar e executar
DICA: Também instale a extensão C/C++ (da Microsoft) para ter destaque de sintaxe e IntelliSense no VSCode.

A Estrutura Básica de um Programa C

Todo programa C segue uma estrutura mínima. Veja o programa mais famoso da história da computação:

// hello.c — Meu primeiro programa em C
#include <stdio.h>      // Inclui a biblioteca de entrada e saída padrão

int main() {            // Função principal — todo programa começa aqui
    printf("Olá, Mundo!\n");  // Imprime uma mensagem na tela
    return 0;           // Retorna 0 ao sistema operacional (sucesso)
}
    
Olá, Mundo!

Anatomia do programa:

Ponteiros e Alocação de Memória — Uma Prévia

Um dos conceitos mais poderosos (e exclusivos) do C é o ponteiro. Um ponteiro é uma variável que armazena o endereço de memória de outra variável, em vez de armazenar um valor diretamente.

Um ponteiro é uma variável especial que guarda um endereço de memória. Por meio dele, é possível ler ou modificar o valor de outra variável de forma indireta.

Exemplo 1 — Modificando uma variável via ponteiro

#include <stdio.h>

int main() {
    int x = 25;           // x armazena o valor 25 no endereço 0940 (exemplo)
    int* y = &x;          // y guarda o ENDEREÇO de x (y aponta para x)
    *y = 30;              // *y modifica o valor na posição apontada por y (= x)

    printf("Valor atual de x: %i\n", x);  // Imprime 30
    return 0;
}
    
$ Valor atual de x: 30