Publicidade

Aula 25: Funções (Avançado)

Mergulho profundo em funções C: passagem por valor, pilha de chamadas e recursão.

📖 O que aprender nesta página
✅ Essencial que você precisa saber
  • Divida o código em funções para reusar
  • Recursão: uma função chama a si mesma
  • Recursão precisa ter um caso-base
⭐ Leia se tiver tempo
  • Estouro de pilha (stack overflow)
  • Otimização de chamada em cauda
  • Funções de callback
💪 É normal não pegar na primeira tentativa
Recursão — uma função chamando a si mesma — parece misteriosa até você vê-la funcionando algumas vezes.
Como encarar de novo
  1. Garanta que está firme em funções básicas primeiro
  2. Faça um traço de fatorial (n!) no papel: expanda fact(5) até fact(1)
  3. Confirme que sempre existe um caso-base
  4. Comece com profundidades pequenas (3 a 5)
  5. Note que a mesma lógica pode ser escrita de forma iterativa — tente escrever as duas versões
💡 Dica: 90% dos bugs de recursão se resumem a um caso-base ausente ou inalcançável, ou a esquecer de diminuir o argumento. Verifique isso primeiro.

Funções com valores de retorno

Uma função recebe parâmetros, faz uma computação e pode retornar um valor para quem a chamou.
int square(int n) {    // return type: int
  return n * n;        // return a value
}
int main(void) {
  int r = square(5);  // call the function; r becomes 25
  printf("%d\n", r);
}
Argumento
O valor passado para a função. Vai dentro dos parênteses.
Valor de retorno
O resultado que a função devolve, via instrução return.
nome(args)
Uma expressão de chamada. Seu valor é o que a função retornar.

void — "nada"

Use void para indicar "sem parâmetros" ou "sem valor de retorno".
// no return, no parameters
void sayHello(void) {
  printf("Hello!\n");     // return can be omitted
}

// no return, with parameter
void printBox(int n) {
  for(int i=0; i<n; i++) printf("*");
  printf("\n");
}

// returns a value, no parameters
int getAnswer(void) {
  return 42;
}
A função main: int main(void) significa "sem parâmetros, retorna um int".

Múltiplos parâmetros e tipos

Você pode passar vários parâmetros separados por vírgulas. Cada um precisa da sua própria declaração de tipo.
double triangleArea(double base, double height) {
  return base * height / 2.0;
}

int main(void) {
  double area = triangleArea(6.0, 4.0);
  printf("area = %f\n", area); // 12.000000
}
Combine os tipos: passar um double (por exemplo, 3.5) para um parâmetro int trunca a parte fracionária.

Memória durante uma chamada (pilha de chamadas)

Quando uma função é chamada, um quadro de pilha é criado para ela. Esse quadro é liberado quando a função retorna.
Clique em "Próximo passo" para percorrer o fluxo da chamada de função.
Pontos-chave:

Experimente você mesmo — funções avançadas

funcs.c
Saída
Clique em "Executar" para rodar...
💡 Tente também estas ideias
Publicidade

Aulas relacionadas

Funções
Aula 24: Funções (Básico)
Definindo e chamando funções em C.
Funções
Aula 28: Protótipo e Macro
Aprenda sobre protótipos de função em C e a macro #define.
Funções
Variáveis globais e escopo
Variáveis globais em C, escopo, tempo de vida e static.
← Aula anterior
Aula 24: Funções (Básico)
Próxima aula →
Aula 26: Funções elementares (math.h)

Quiz de Revisão

Confira sua compreensão desta aula!

Q1. Quando você passa um array para uma função em C, o que é realmente passado?

Uma cópia do array
O endereço do primeiro elemento
O tamanho do array

Em C, o nome de um array se transforma em um ponteiro para o seu primeiro elemento, então o array inteiro não é copiado.

Q2. O que é essencial em uma função recursiva?

Uma variável global
Um caso-base (condição de parada)
Um ponteiro

Uma função recursiva chama a si mesma, então sem um caso-base você acaba com recursão infinita e estouro de pilha.

Q3. Qual é um uso típico de ponteiros de função?

Liberar memória
Implementar callbacks
Manipulação de strings

Ponteiros de função guardam o endereço de uma função. São comumente usados para callbacks, tabelas de despacho e padrões similares.

Compartilhe este artigo
Compartilhar no X (Twitter) Compartilhar no Facebook