14.03.2015 Views

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!