Quais as características da função com passagem de valor?
Soluções para a tarefa
Resumo:
A linguagem de programação C permite que os parâmetros sejam passados para as funções de duas maneiras, por valor e por referência. Na passagem por valor, como o próprio nome diz, uma expressão pode ser utilizada na chamada. O valor da expressão é calculada, e o valor resultante é passado para a execução da função. Na passagem por referência, o endereço de uma variável deve ser passado na chamada da função. Dessa forma, a função pode modificar a variável diretamente, o que em geral não é recomendável, mas há situações onde esse recurso é necessário, por exemplo, para a criação de funções que devolvem mais de um valor.
Descrição:
Até o momento, vimos apenas uma forma de passagem de parâmetros, conhecida como passagem por valor. Essa forma permite que as variáveis de uma função sejam protegidas, ou seja, apenas a função onde as variáveis foram declaradas pode modificar seu conteúdo. Permitir que uma função modifique o conteúdo de outra pode ser muito perigoso, mas há situações onde isso é necessário. Vamos primeiro lembrar como funciona a passagem por valor e depois introduzir o conceito de passagem por refência.
Passagem por Valor
É a forma mais comum utilizada para passagem de parâmetros. Por exemplo, considere a família de funções trigonométricas, como seno, cosseno, etc. A função seno, por exemplo, recebe o valor de um ângulo (um número real) e devolve o seno desse ângulo. Se tivermos as funções seno e cosseno, podemos facilmente definir uma função tangente. Em projetos grandes de desenvolvimento de software, grupos de programadores podem trabalhar no desenvolvimento de funções distintas e juntar os seus trabalhos uma vez que tenham suas funções prontas. Para isso, basta que cada grupo conheça o protótipo das funções que precisa utilizar, e ao final, um programa chamodo "linker" é responsável por juntar os pedaços e construir um programa executável. Por exemplo, considere que nós temos disponíveis os seguintes protótipos para as funções seno e cosseno:
float seno (float angulo);
float cosseno (float angulo);
Conhecendo esses protótipos, podemos escrever a função tangente da seguinte forma:
float tangente (float angulo)
{
float s, c;
s = seno(angulo);
c = cosseno(angulo);
return s/c;
}
Essa função claramente calcula o seno antes de calcular o cosseno. Imagine se a função seno pudesse modificar o valor do parâmetro angulo. Nesse caso, o valor passado para a função cosseno seria diferente do valor original usado para o seno, e o resultado da função tangente estaria incorreto. A passagem por valor consegue evitar esse tipo de "efeito colateral" através da criação de variáveis locais para os parâmetros. Quando uma função é chamada, essas variáveis são carregadas, como em atribuições, antes do início da execução do corpo da função. Vamos falar um pouco mais do escopo de variáveis a seguir.