Você está na página 1de 20

Algoritmos e Programao II

Aula 10 Profa. Karine Birnfeld

Chamada por valor e chamada por referncia


A chamada por valor a passagem normal do valor dos argumentos para a funo. Utilizando esta chamada os valores dos argumentos passados no so modificados. Na realidade passada uma cpia dos valores para a funo. Na chamada por referncia so passados os endereos de memria onde esto os argumentos. Neste tipo de chamada os valores podem ser modificados.

Chamada por valor


Na passagem por valor, 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.

Chamada por valor


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)); }

Chamada por valor


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).

Chamada por valor

Chamada 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.

Chamada por Referncia


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 funes).

Chamada por Referncia


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.

Chamada por Referncia


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.

Chamada por Referncia


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. Cuidado com operaes aritmticas que envolvam ponteiros (ex:(*x)++; )

Chamada por Referncia

Chamada por Referncia


OBSERVAO: As strings e matrizes sempre so chamadas por referncia. Quando C passa uma matriz ou string para uma funo passado o endereo inicial da matriz ou funo.

Passagem de Vetores e Matrizes


O nome de um vetor corresponde ao endereo do primeiro elemento do array. Quando um vetor passado como parmetro, apenas o endereo do primeiro elemento passado. Existem basicamente trs maneiras de declarar um vetor como um parmetro de uma funo.

Passagem de Vetores e Matrizes


O exemplo a seguir mostra um programa que usa uma funo para descobrir quantas vezes um caracter ocorre em um vetor. Observe que a dimenso do vetor foi declarada explicitamente.

Passagem de Vetores e Matrizes


Uma outra maneira, leva em conta que apenas o endereo do vetor passado. Neste modo o parmetro declarado como um vetor sem dimenso. Isto perfeitamente possvel porque a funo somente precisa receber o endereo onde se encontra o vetor. Alm disso C no confere limites de vetores e portanto a funo precisa do endereo inicial do vetor e uma maneira de descobrir o final do vetor. Esta maneira pode ser, por exemplo, uma constante, ou o caracter '\0' em um vetor de caracteres. O exemplo a seguir mostra este modo de passar vetores com um programa que inverte o contedo de um vetor.

EXERCCIOS
Fazer lista de exerccios 09.

Algoritmos e Programao II
Aula 09 Profa. Karine Birnfeld

Você também pode gostar