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 argumentos em funções.

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

Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Função/procedimento com parâmetros
  2. Argumentos para funções/procedimentos
  3. Omitindo parâmetros
  4. Parâmetros variáveis

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_dado> nome_param1, <tipo_dado> nome_paramN)
{
  //corpo procedimento
}
Sintaxe 2: função
tipo_retorno nome_funcao(<tipo_dado> nome_param1, <tipo_dado> nome_paramN)
{
  //corpo da funcao
  return valor; 
}
Onde
tipo_retorno: Tipo de dado retornado pela função, sendo void para procedimento
<tipo_dado>: 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 também na declaração de parâmetros.

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, o uso de void não é obrigatória.

Funções em C podem ser declaradas de forma que suportem vários parâmetros de um mesmo tipo ou tipos diferentes. Na declaração de uma função, devemos informar um parâmetro que armazena a quantidade de parâmetros e outro parâmetros que irá receber um array de parâmetros. 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

Uma função para suporta vários parâmetros segue a sintaxe abaixo:

Sintaxe: função
tipo_retorno nome_funcao(int num_params,...)
{
    //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 a função. Essa lista é 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. 03/09/2025 - revisão 5 - Ajustes: pontuais e sintaxes
  2. 05/05/2025 - revisão 4 - Adição de parâmetros variáveis
  3. 12/03/2025 - revisão 3 - Ajustes pontuais
  4. 08/10/2024 - revisão 2 - Correção: links internos; Ajustes pontuais
  5. 28/09/2023 - revisão 1 - Correção em referências, erros gramaticais, sintaxe e exemplos
  6. 19/05/2023 - versão inicial