Tanto as funções quanto os procedimentos na linguagem C, assim como outras linguagem, aceitam parâmetros e argumentos. Nesta parte do tutorial vamos estudar o uso de parâmetros e argumento em funções.

A declaração de funções como parâmetro para funções pode ser visto em C Ponteiro: Ponteiro para função.

Independente de ser uma função ou procedimentos, o uso ou declaração de parâmetros para ambos é feito da mesma forma: declaramos a lista de parâmetros com seus respectivos tipo de dados e nomes entre ( e ) e separados por (,) como pode ser visto na sintaxe abaixo:

Sintaxe 1: procedimento
void nome_procedimento(tipo_param param1, tipo_param nome_paramN)
{
  //corpo procedimento
}
Sintaxe 2: função
tipo_retorno nome_funcao(tipo_param param1, tipo_dado_param paramN)
{
  //corpo da funcao
  return valor; 
}
Onde
tipo_retorno: Tipo de dado retornado pela função, sendo void para procedimento
tipo_param: Tipo de dado do parâmetro.
param1..N: lista de parâmetros separados por (,).

Os nomes dos parâmetros devem seguir as mesmas regras de nomes de variáveis vistos em C Variáveis: Nomenclatura de variáveis.

Exemplo 1
#include <stdio.h>

int soma(int a, int b);
void procedimento(int a);

int main()
{
    int ret = soma(2,3);
    printf("%d\n",ret);
    procedimento(2);
}

int soma(int a, int b)
{
  return a + b;
}

void procedimento(int a)
{
    printf("%d",a);
}
Saída
5
2

A passagem de argumentos para uma função podem ser utilizados valores fixos ou variáveis. Os argumentos devem ser passados seus nomes ou valores entre ( e ) e separados por (,) como pode ser visto na sintaxe abaixo:

Sintaxe 1
nome_procedimento(arg1, arg2, argN);
Sintaxe 2
nome_funcao(nome_arg1, nome_argN);
Onde
arg1..N: valores, variáveis ou expressões

A passagem de argumentos por valor ou referência serão estudados na próxima seção C Função: Passagem por Valor/Referência.

Exemplo 2
#include <stdio.h>

int soma(int a, int b);

int main()
{
    int _soma = soma(1,2);
    printf("Soma:%d\n", _soma);
    
    int valor1=10,valor2=20;
    
    _soma = soma(valor1,valor2);
    printf("Soma:%d", _soma);
    
    return 0;
}

int soma(int a, int b)
{
  return a + b;
}
Saída
Soma:3
Soma:30

A omissão de parâmetros/argumentos e retorno podem ser feita utilizando a palavra reservada void na declaração do tipo de dado de retorno e na declaração de parâmetros/argumentos.

Sintaxe 1
void nome_funcao(void);
Exemplo 3
#include <stdio.h>

void procedimento(void); //protótipo da função 2

int funcao(void)
{
    return -1;
}

void main (void)
{
    procedimento();//sem argumento
    funcao();//sem argumento

}

void procedimento(void)
{
    printf("procedimento\n");    
}
Saída
funcao1
funcao2

Tanto a declaração de função/procedimento sem parâmetros quanto a omissão de argumentos utilizando void não é obrigatória.

Funções em C podem ser declaradas de forma a suportar vários parâmetros de um mesmo tipo ou tipos diferentes utilizando um parâmetro para informar que a função suporta vários parâmetros, e outro para informar a quantidade de parâmetros informados. Para isso, precisamos adicionar a biblioteca stdard:

Sintaxe
#include <stdarg.h>

Essa biblioteca fornece as funções e tipos listados abaixo:

  1. va_list — tipo de dado para armazenar os parâmetros variáveis
  2. va_start(va_list, numero_parametros) — Função para iniciar lista de parâmetros
  3. va_arg(va_list, tipo_dado) — função que retorna próximo parâmetro
  4. va_end(va_list) — função para limpa va_list
Sintaxe: função
tipo_retorno nome_funcao(num_params int,...)
{
    //omitido
}
Onde
: operador de parâmetros variáveis
num_params: número de parâmetros informados. Obrigatório

Com o tipo va_list, armazenamos a lista de argumentos passados para uma função que é criada pela função va_start. Com um comando de repetição, acessamos o argumento utilizando a função va_arg.

Exemplo 4
#include <stdio.h>
#include <stdarg.h>

void funcao(int num_params, ...)
{
    va_list params; //armazena ...
    va_start(params,num_params); 
    
    for (int varg = 0; varg < num_params; varg++) 
        printf("%d ", va_arg(params, int)); //tipo int
        
    va_end(params); //libera lista
}

int main()
{
    funcao(5,1,0,-1,-20,30,40);
    printf("\n");
    funcao(5,0x1,0x0,0xffffffff,0xFFFFFFEC,0x1e,0x28);
}
Saída
1 0 -1 -20 30 
1 0 -1 -20 30

Não há como checar os tipos de dados de lista variáveis de parâmetros. Cada argumento passado deve ter seu valor tratado de acordo com o tipo de dado desejado.

No caso de argumentos com tipos de dados diferentes, as posições em que esses tipos estão devem ser tratados de acordo com os tipos esperados.

  1. 05/05/2025 - revisão 4 - Adição de parâmetros variáveis
  2. 12/03/2025 - revisão 3 - Ajustes pontuais
  3. 08/10/2024 - revisão 2 - Correção: links internos; Ajustes pontuais
  4. 28/09/2023 - revisão 1 - Correção em referências, erros gramaticais, sintaxe e exemplos
  5. 19/05/2023 - versão inicial