Apostila C da UFMG - Universidade do Minho
Apostila C da UFMG - Universidade do Minho
Apostila C da UFMG - Universidade do Minho
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
{<br />
num=num*num;<br />
return num;<br />
}<br />
No exemplo acima o parâmetro formal num <strong>da</strong> função sqr() sofre alterações dentro <strong>da</strong> função, mas a variável num <strong>da</strong><br />
função main() permanece inaltera<strong>da</strong>: é uma chama<strong>da</strong> por valor.<br />
Outro tipo de passagem de parâmetros para uma função ocorre quan<strong>do</strong> alterações nos parâmetros formais, dentro <strong>da</strong><br />
função, alteram os valores <strong>do</strong>s parâmetros que foram passa<strong>do</strong>s para a função. Este tipo de chama<strong>da</strong> de função tem o<br />
nome de "chama<strong>da</strong> por referência". Este nome vem <strong>do</strong> fato de que, neste tipo de chama<strong>da</strong>, não se passa para a função<br />
os valores <strong>da</strong>s variáveis, mas sim suas referências (a função usa as referências para alterar os valores <strong>da</strong>s variáveis<br />
fora <strong>da</strong> função).<br />
O C só faz chama<strong>da</strong>s por valor. Isto é bom quan<strong>do</strong> queremos usar os parâmetros formais à vontade dentro <strong>da</strong> função,<br />
sem termos que nos preocupar em estar mexen<strong>do</strong> nos valores <strong>do</strong>s parâmetros que foram passa<strong>do</strong>s para a função. Mas<br />
isto também pode ser ruim às vezes, porque podemos querer mu<strong>da</strong>r os valores <strong>do</strong>s parâmetros fora <strong>da</strong> função também.<br />
O C++ tem um recurso que permite ao programa<strong>do</strong>r fazer chama<strong>da</strong>s por referência. Há entretanto, no C, um recurso<br />
de programação que podemos usar para simular uma chama<strong>da</strong> por referência.<br />
Quan<strong>do</strong> queremos alterar as variáveis que são passa<strong>da</strong>s para uma função, nós podemos declarar seus parâmetros<br />
formais como sen<strong>do</strong> ponteiros. Os ponteiros são a "referência" que precisamos para poder alterar a variável fora <strong>da</strong><br />
função. O único inconveniente é que, quan<strong>do</strong> usarmos a função, teremos de lembrar de colocar um & na frente <strong>da</strong>s<br />
variáveis que estivermos passan<strong>do</strong> para a função. Veja um exemplo:<br />
#include <br />
void Swap (int *a,int *b);<br />
void main (void)<br />
{<br />
int num1,num2;<br />
num1=100;<br />
num2=200;<br />
Swap (&num1,&num2);<br />
printf ("\n\nEles agora valem %d %d\n",num1,num2);<br />
}<br />
void Swap (int *a,int *b)<br />
{<br />
int temp;<br />
temp=*a;<br />
*a=*b;<br />
*b=temp;<br />
}<br />
Não é muito difícil. O que está acontecen<strong>do</strong> é que passamos para a função Swap o endereço <strong>da</strong>s variáveis num1 e<br />
num2. Estes endereços são copia<strong>do</strong>s nos ponteiros a e b. Através <strong>do</strong> opera<strong>do</strong>r * estamos acessan<strong>do</strong> o conteú<strong>do</strong><br />
aponta<strong>do</strong> pelos ponteiros e modifican<strong>do</strong>-o. Mas, quem é este conteú<strong>do</strong>? Na<strong>da</strong> mais que os valores armazena<strong>do</strong>s em<br />
num1 e num2, que, portanto, estão sen<strong>do</strong> modifica<strong>do</strong>s!<br />
Espere um momento... será que nós já não vimos esta história de chamar uma função com as variáveis precedi<strong>da</strong>s de<br />
&? Já. É assim que nós chamamos a função scanf(). Mas porquê? Vamos pensar um pouco. A função scanf() usa<br />
chama<strong>da</strong> por referência porque ela precisa alterar as variáveis que passamos para ela! Não é para isto mesmo que ela é<br />
feita? Ela lê variáveis para nós e portanto precisa alterar seus valores. Por isto passamos para a função o endereço <strong>da</strong><br />
variável a ser modifica<strong>da</strong>!<br />
7.8 - Matrizes como Argumentos de Funções<br />
Quan<strong>do</strong> vamos passar uma matriz como argumento de uma função, podemos declarar a função de três maneiras<br />
equivalentes. Digamos que temos a seguinte matriz:<br />
int matrx [50];<br />
e que queiramos passá-la como argumento de uma função func(). Podemos declarar func() <strong>da</strong>s três maneiras<br />
seguintes:<br />
void func (int matrx[50]);<br />
void func (int matrx[]);<br />
void func (int *matrx);<br />
Pág. 53