Você está na página 1de 2

Passagem de Parmetros para uma Funo (VALOR x REFERNCIA)

Por Valor: Na passagem por valor (como foi visto at agora), os parmetros de uma funo funcionam como variveis suas, ou seja NADA tem a ver com as variveis da funo que a chamou. Desta forma alteraes nos valores desses parmetros no interferem nos valores das variveis da funo chamadora. int soma (int x1, int x2) { x1+= x2; return x1; } void main (void) { int v1, v2; scanf(%d %d,&v1,&v2); printf(%d,soma(v2,v1)); }

Nesta funo por exemplo x1 alterado mas a varivel v2 da main no alterada. Isso ocorre porque o parmetro x1 funciona como uma varivel da funo soma apenas inicializada com o valor de v2 (por isso se chama passagem de parmetro por valor) Por Referncia: No entanto pode ser interessante que uma varivel na funo chamadora possa ser alterada (ex: funo que troque o valor de duas variveis). Ou mesmo haja a necessidade de se retornar mais de um valor da funo (pois com o return s possvel retornar um nico valor), por exemplo funo que retorne as horas e minutos dados apenas os minutos. Para esses casos, algumas linguagens permitem a passagem de parmetros por referncia, onde uma varivel passada como parmetro ao ser alterada dentro da funo tem seu valor alterado tambm na funo chamadora ( na verdade uma nica varivel usada por ambas as fues). Na linguagem C na teoria existe apenas passagem de parmetros por valor, mas atravs do uso de ponteiros se consegue na prtica a passagem de parmetros por referncia. Ex: void troca(int *x, int *y) { int aux; aux=*x; *x=*y; *y=aux; } void main(void) { int a=10,b=20; troca(&a,&b); printf(%d %d,a,b); }

A presena do * na frente do nome dos parmetros indica que esses so na verdade ponteiros. Ao passar o parmetro por referncia a funo chamadora deve passar o

endereo da sua varivel, para isso usa-se o &. O scanf um exemplo de funo que altera o valor da varivel passada como referncia. (Desenho Memria)

Observaes: Para que seja feita a passagem por referncia imprescindvel que tanto a funo a ser chamada esteja recebendo em um ponteiro e a funo chamadora esteja passando o endereo de uma varivel. Como fica quando uma funo chama a outra, ambas usando parmetro passado por referncia? (um exemplo de duas funes quaisquer e outro com scanf) Prottipo omitindo o nome da varivel no deve omitir o *. Cuidado com operaes aritimticas que envolvam ponteiros (ex:(*x)++; ) Exerccios: 1) Faa uma funo que receba um parmetro (inteiro por valor) com o total de minutos passados ao longo do dia e receba tambm dois parmetros (inteiros por referncia) no qual deve preencher com o valor da hora e do minuto corrente. Faa um programa que leia do teclado quantos minutos se passaram desde meia-noite e imprima a hora corrente (use a sua funo). 2) Faa uma funo que receba um valor inteiro como referncia e retorne o resto da diviso deste nmero por 10. Altere tambm o valor da varivel passada por referncia, dividindo-a por 10. Faa um programa que imprima invertido os nomes do algarismos de um nmero inteiro. (Use a sua funo!) Ex: 234 sada: quatro trs dois

Você também pode gostar