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

  1. Entender passagem por valor
  2. Entender passagem por referência

A linguagem C permite que argumentos sejam passados para funções/procedimentos de duas formas: por valor ou por referência. Nesta parte do tutorial vamos essas duas formas.

Esse assunto sobre passagem por valor por valor ou por referênciatambém foi discutido em Portugol: Passagem de argumentos em Portugol.

Para a passagem por refência, o tipo de dado ponteiro será utilizado. O assunto ponteiro pode ser visto com mais detalhes em Ponteiro.

Quando passamos argumentos para serem utilizados em um função/procedimento sem que a seus valores sejam alterados, passamos esses argumentos por valor. Esse valores criados de forma temporária e ao término da função/procedimento são descartados.

Sintaxe 1
void nome_procedimento(arg1, argN);
Sintaxe 2
nome_funcao(arg1, argN);
Onde
nome_arg1..N: argumentos passados
Exemplo 1
#include <stdio.h>

void soma(int a, int b)
{
  a = 100;
  b = 200;
  printf("durante a:%d b:%d\n", a,b);
}

int main()
{
    int a=1,b=2;
    printf("antes a:%d b:%d\n", a,b);
    soma(a,b);
    printf("depois a:%d b:%d\n", a,b);
}
Saída
antes a:1 b:2
durante a:100 b:200
depois a:1 b:2

Os valores das variáveis a e b passadas como argumentos para a funcão soma onde são alterados internamente. Porém, após serem utilizadas as variáveis são destruídas não resultando em alteração dos valores no escopo da função main como pode ser observada na saída.

Quando passamos variáveis como argumentos para serem alteradas dentro de uma função ou procedimento, e seus valores não serem descartados, passamos esses argumentos por referência. Sendo assim, estamos passando uma referência de uma variável para que o conteúdo da mesma possa ser alterado.

A passagem por referência utiliza o operador (&) antes do nome do parâmetro.

Sintaxe 1
nome_procedimento(&arg1, &argN);
Sintaxe 2
nome_funcao(&arg1, &argN);
Onde
arg1..N: argumentos passados

Tanto a função quanto o procedimentos devem ter seus parâmetros declarados como ponteiros para receber a referência de variáveis. Isso é feito utilizando o operadore *.

Sintaxe 3
void nome_procedimento(tipo_dado_param *nome_param1, tipo_dado_param *nome_paramN)
{
  //corpo procedimento
}
Sintaxe 4
tipo_retorno nome_funcao(tipo_param nome_param1, tipo_param paramN)
{
  //corpo da funcao
  retorn valor; 
}
tipo_retorno: Tipo de dado retornado pela função
tipo_param: Tipos de dado do parâmetro.
param1..N: parâmetros separados por (,)
Exemplo 2
#include <stdio.h>

void soma(int *a, int *b)
{
  *a = 100;
  *b = 200;
  printf("durante a:%d b:%d\n", *a,*b);
}

int main()
{
    int a=1,b=2;
    printf("antes a:%d b:%d\n", a,b);
    soma(&a,&b);
    printf("depois a:%d b:%d\n", a,b);
}
Saída
antes a:1 b:2
durante a:100 b:200
depois a:100 b:200
  1. 11/03/2025 - revisão 3 - Remoção de nomenclatura de argumento; Ajustes pontuais
  2. 08/10/2024 - revisão 2 - Correção: link portugol; Remoção: referência à ponteiros repetida; Ajustes pontuais
  3. 28/09/2023 - revisão 1 - Correção em referências, erros gramaticais, sintaxe e exemplos
  4. 19/05/2023 - versão inicial