Passagem de Parâmetro

Por: Heitor Pasti

A passagem de parâmetro é assunto muito recorrente nas mais diversas provas de concursos por aí e hoje vamos conversar um pouco sobre isto.

Vamos partir do do princípio que temos uma função qualquer. De forma muito simples, a estrutura de uma função segue da seguinte forma:

tipo_da_dado nome_da_funcao (lista de parametros) {      
corpo da função;
instrução de retorno;  
} 

No tipo do dado temos o que vai especificar o tipo de valor, por exemplo inteiro ou real, que a função irá retornar (return). Para o nome da função seguimos as mesmas regras da declaração de variáveis. Por fim, e não menos importante, a lista de parâmetros é uma lista de nomes de variáveis seguidas do seu tipo. Se houver mais um de parâmetro serão separados por vírgula.

Passadas as informações acima, agora vamos falar sobre a passagem de parâmetro.

A passagem de parâmetro pode ser feita de duas formas: Passagem de Parâmetro por Valor e Passagem de Parâmetro por Referência.

Passagem de Parâmetro por Valor

Na Passagem de Parâmetro por Valor uma cópia do valor de um argumento é feito no parâmetro da função (aqueles entre os parênteses).

Ao fazer esta cópia do valor, qualquer alteração feita no parâmetro não terá nenhum efeito nas variáveis usadas para chamá-la.

Vamos a um exemplo:

No exemplo acima temos uma função de inteiros, chamada funcao, com um parâmetro, chamado x também de inteiros. No corpo da função funcao temos uma multiplicação simples e uma instrução de retorno, que retorna x.

Dentro da função principal, int main, que é quem chamará a função funcao, temos uma variável t, de inteiros, que irá fazer a chamada da função efetivamente.

Agora é que vem o pulo do gato. Perceba que dentro do printf estamos imprimindo dois valores: no primeiro temos t chamando a função funcao e no segundo apenas o t.

Quando t chama a função, funcao(t), ele manda uma cópia do seu valor para a função. Dentro da função funcao a cópia deste valor é recebido pelo parâmetro x.

Assim, quando chamamos a função funcao, pela variável t, a cópia do valor, que é 10, é usado pela função, por isso retorna o valor 100. Perceba, portanto, que quando chamamos apenas o valor de t, ele permanece inalterado dentro da função principal.

Isto ocorre, pois na Passagem de Parâmetro por Valor o que ocorre dentro da função não tem efeito algum sobre a variável usada na chamada da mesma.

Resumindo a Passagem de Parâmetro por Valor: é feita uma cópia de um argumento, no exemplo é a variável t, para o parâmetro da função funcao, que no nosso exemplo é x e qualquer alteração do valor dentro da função não afeta em nada o valor original do argumento.

Passagem de Parâmetro por Referência

Na Passagem de Parâmetro por Referência passamos todo o endereço do argumento para o parâmetro. Devido a isto, qualquer alteração feita no parâmetro afeta a variável usada para chamar a função, pois dentro da função é usado o endereço real do argumento para acessá-lo na hora da chamada da função.

Vamos a um exemplo:

Obs. Quando fazemos o uso de Passagem de Parâmetro por Referência utilizamos ponteiros para passar o endereço da variável.

Perceba acima, que passamos para a função funcao o endereço completo do argumento (funcao &t), por isso, as alterações que foram feitas dentro da função afetaram diretamente o valor original do argumento. Portanto, temos o mesmo valor tanto para chamada da função quanto para chamada direto da variável t, pois neste tipo de passagem de parâmetro o que acontece na função afeta o valor original da variável usada na chamada.


Resumindo a Passagem de Parâmetro por Referência: o endereço de um argumento, no exemplo é a variável t, é passado para o parâmetro da função funcao, que no nosso exemplo é x, e qualquer alteração do valor dentro da função afeta o valor original do argumento.

Concluimos, portante que:

  • na Passagem de Parâmetro por Valor as alterações feitas na função NÃO afetam o valor do argumento usado para chamar a função, pois é passado apenas o valor do argumento.
  • na Passagem de Parâmetro por Referência as alterações feitas na função afetam o valor do argumento usado para chamar a função, pois é passado todo o endereço real do argumento.

Por hoje é isso, forte abraço e até a próxima.

Heitor Pasti

Graduado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de Educação, Ciência e Tecnologia do Espírito Santo - IFES (2016). Professor, desde 2017, de várias disciplinas, dentre as quais Algoritmo e Lógica de Programação, Linguagem de Programação e POO, do curso técnico em informática integrado ao ensino médio pelo governo do Espírito Santo e também coordenador do mesmo curso.