Você está na página 1de 6

22/02/2017 Funes:passagemdeparmetros

Funes:passagemdeparmetros

Resumo:
AlinguagemdeprogramaoCpermitequeosparmetrossejampassadosparaasfunesdeduasmaneiras,
porvaloreporreferncia.Napassagemporvalor,comooprprionomediz,umaexpressopodeser
utilizadanachamada.Ovalordaexpressocalculada,eovalorresultantepassadoparaaexecuoda
funo.Napassagemporreferncia,oendereodeumavariveldeveserpassadonachamadadafuno.
Dessaforma,afunopodemodificaravariveldiretamente,oqueemgeralnorecomendvel,mash
situaesondeesserecursonecessrio,porexemplo,paraacriaodefunesquedevolvemmaisdeum
valor.

Descrio:
Atomomento,vimosapenasumaformadepassagemdeparmetros,conhecidacomopassagemporvalor.
Essaformapermitequeasvariveisdeumafunosejamprotegidas,ouseja,apenasafunoondeas
variveisforamdeclaradaspodemodificarseucontedo.Permitirqueumafunomodifiqueocontedode
outrapodesermuitoperigoso,mashsituaesondeissonecessrio.Vamosprimeirolembrarcomo
funcionaapassagemporvaloredepoisintroduziroconceitodepassagemporrefncia.

PassagemporValor
aformamaiscomumutilizadaparapassagemdeparmetros.Porexemplo,considereafamliadefunes
trigonomtricas,comoseno,cosseno,etc.Afunoseno,porexemplo,recebeovalordeumngulo(um
nmeroreal)edevolveosenodessengulo.Setivermosasfunessenoecosseno,podemosfacilmente
definirumafunotangente.Emprojetosgrandesdedesenvolvimentodesoftware,gruposdeprogramadores
podemtrabalharnodesenvolvimentodefunesdistintasejuntarosseustrabalhosumavezquetenhamsuas
funesprontas.Paraisso,bastaquecadagrupoconheaoprottipodasfunesqueprecisautilizar,eao
final,umprogramachamodo"linker"responsvelporjuntarospedaoseconstruirumprograma
executvel.Porexemplo,considerequenstemosdisponveisosseguintesprottiposparaasfunessenoe
cosseno:

floatseno(floatangulo);
floatcosseno(floatangulo);

Conhecendoessesprottipos,podemosescreverafunotangentedaseguinteforma:

floattangente(floatangulo)
{
floats,c;
s=seno(angulo);
c=cosseno(angulo);
returns/c;
}

Essafunoclaramentecalculaosenoantesdecalcularocosseno.Imagineseafunosenopudesse
modificarovalordoparmetroangulo.Nessecaso,ovalorpassadoparaafunocossenoseriadiferentedo
valororiginalusadoparaoseno,eoresultadodafunotangenteestariaincorreto.Apassagemporvalor
consegueevitaressetipode"efeitocolateral"atravsdacriaodevariveislocaisparaosparmetros.
Quandoumafunochamada,essasvariveissocarregadas,comoematribuies,antesdoincioda
execuodocorpodafuno.Vamosfalarumpoucomaisdoescopodevariveisaseguir.

Escopodevariveis
https://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm 1/6
22/02/2017 Funes:passagemdeparmetros

Oescopodeumavariveldefinidopelasregies(blocos)ondeavarivelpodeserutilizada.Porexemplo,
asvariveisdeclaradasnoinciodocorpodafunomainpodemserutilizadasemqualquerlugardentroda
funomain,pormapenasDENTROdamain,ouseja,nopodemserutilizadasemoutrafuno.Variveis
declaradasnomesmoescopoprecisamternomesdiferentes,masnomespodemser"reaproveitados"em
outrosescopos.Vejamosoexemploabaixo:
#include<stdio.h>
#include<stdlib.h>

intfat(intn)
{
intres=1;
while(n>1){
res=res*n;
n;
}
returnres;
}

intmain()
{
intn,res;
printf("Entrecomovalorden:");
scanf("%d",&n);
res=fat(n+1)/(n+1);
printf("Fatorialde%d=%d\n",n,res);
system("pause");
return0;
}

Observequeafunomainefatpossuemambasvariveiscomonomeres,equemainpossuiumavarivel
chamadan,queonomedoparmetrodafunofat.Procurenoseconfundir,poisapesardomesmo
nome,elassovariveisdiferentes.Paraafunofat,oparmetronfuncionacomoumavarivellocal(ou
seja,vlidadentrodafunoapenas),juntamentecomavarivelres.Adiferenaqueoparmetronrecebe
seuvalornoinstantedachamada.Vamossimularesseprogramaparaaentrada2.

Oprogramasempreiniciasuaexecuopelafunomain,quesolicitaaentradadeumvalorparan.Alinha
res=fat(n+1)/(n+1);chamaafunofat.Comon=2(entradadoprograma),entoovalor3( passado
paraafuno,ouseja,essevaloratribuidoaoparmetroneafunofatcomeaaexecutarseucorpo.O
fatorialde3calculadoeovalor6atribuidovarivelres.Observequeoparmetronutilizadocomo
varivel,oquepermitidopelalinguagemC.Esseparmetrodecrementadoat1,porm,comoso
variveisdiferentes,ovalordendentrodemaincontinuasendo2.Aoterminarochamado,afunofat
devolveovalor6aolugarondefoichamadodentrodafunomain,eoprogramacontinuaparacalcularo
valordaexpressofat(n+1)/(n+1).Comoovalordencontinua2,oresultadodadiviso .Essevalor
atribudovarivelres.Oltimoprintfimprimeovalordeneres,quecorrespondemaosvalores2e2,
respectivamente.

PassagemporReferncia
Semprequepossvelrecomendvelutilizaraformadepassagemporvalor,paraevitar"efeitoscolaterais",
mashsituaesondeessesefeitossodesejveis,porexemplo,quandodesejamoscriarumafunoque
retornemaisdeumvalor.Asfunesquevimosatagora,seno,cosseno,potencia,fatorial,etc,sdevolvem
umvalor,masqueoutrasfunes,quetrabalhemcomnmerosimaginriosporexemplo,precisamretornar2
valores.Porexemplo,tenteescreverumafunoqueretorneoquadradodeumnmeroimaginrio.

Sabemosqueumnmeroimaginrio(oucomplexo) possuiumapartereal eoutracomplexa ,e


podemosescreveressenmerocomo ,onde ,eoquadradode como .Assim,avarivel
complexa tempartereal epartecomplexa .

Poderamosfazerumafunopararetornarapenasapartereal,eoutrapararetornarapenasaparte
imaginria.MasoCpermitecriarumafunoqueretorneosdoisvaloressimultaneamente.Observea
https://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm 2/6
22/02/2017 Funes:passagemdeparmetros

seguintefuno:
voidcomplexo2(float*r,float*t)
{
floatreal;

real=(*r**r)(*t**t);
*t=2**r**t;
*r=real;
}

Funesdotipovoidcomodefinidasacimacorrespondemafunesquenoretornamumvalor.Noentanto,
osmbolo'*'nadefiniodosparmetrosrealeimaginriodafunocomplexo2indicamqueesses
parmetrosPODEMsermodificadosdentrodafuno,ouseja,alteraesqueessesparmetrossofrerem
serosentidasFORAdafuno,quecorrespondemaosefeitoscolateraisqueNOOOCORREMquandoos
parmetrossopassadosporvalor(semousodocaractere'*').

Noteaindaqueessanotaopodeserconfusa,poiscomooparmetrodeentrada*re*t,dentrodafuno
vocprecisautilizaressesmesmos"nomes",eissopodeficarconfusoquandoutilizamosessesparmetros
pararealizarmultiplicaes.

Vamosagoraverumprogramaqueutilizaessafuno:
#include<stdio.h>
#include<stdlib.h>

/*definicaodoprototipo*/
voidcomplexo2(float*r,float*t);

intmain()
{
floata,b;

printf("Entrecomumnumerocomplexo(2numerosinteiros):");
scanf("%f%f",&a,&b);
complexo2(&a,&b);
printf("Oquadradodonmerocomplexo%f+i%f\n",a,b);

system("pause");
return0;
}

Observequenomainsodeclaradasapenasduasvariveisreaisaeb.Observetambmquetantona
chamadadafunoscanfquantonachamadadafunocomplexo2,asvariveisaebsoprecedidaspelo
caractere'&'.Nessecaso,essecaractereindicaquequeremosqueessesparmetrossejammodificadospela
funo,eretornemosvaloresapropriados.Nocasodafunoscanf,essesvalorescorrespondemaosvalores
digitadospelousurio,masnocasodafunocomplexo2,essesvaloressocomputadospelafuno.
Finalmente,observetambmqueosprpriosvaloresarmazenadosnasvariveisaebsoutilizadoscomo
entradadafunocomplexo2,ouseja,essesvaloressoutilizadoscomoparterealeimaginriaparacalcular
ovalordoquadradodonmerocomplexo,eaomesmotemposoutilizadosparadevolveroresultado.
Assim,nocasodascanf,osparmetrosaebsoutilizadosapenasparasada,enocasodacomplexo2,os
parmetrosaebsoutilizadoscomoentradaEsadadafuno.

Jnafunoprintf,asvariveisaebnosoprecedidaspelocaractere'&',eportantoNOSO
modificadaspelafunoprintf.

RESUMINDO,quandodesejamoscriarumafunoquedevolvamaisdeumvalor,precisamosdefiniresses
parmetroscomumcaractere'*'noprottipodafuno,eaochamarafuno,osparmetrosutilizadosna
chamadacorrespondentessadaprecisamserprecedidospelocaractere'&'paraindicarqueelespodemser
modificadospelafunochamada.

PonteirosouApontadores
https://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm 3/6
22/02/2017 Funes:passagemdeparmetros

Sevocentendeucomocriarfunesquemodificamosparmetros(usando'*')ecomochamaressas
funesemseusprogramas(usando'&'),vocnoprecisasaberoquesoponteirosouapontadorespor
enquanto,massevocquisersabercomoissoimplementadonalinguagemC,entocontinuecomasua
leitura.

Umapontadorouponteiroumtipodevarivelquenocontmumvalor,masumendereo.Lembreseque
amemriadocomputadororganizadanaformadeumatabela.Cadalinhadatabelapossuiumendereo,e
emcadaendereopodemosarmazenarumvalor.Cadavarivel,aosercriada,associadaaumendereo.
Quandoumavarivelutilizadaemumaexpressodoladodireitodeumaatribuio,seuendereo
utilizadoparabuscarseuvalor,eessevalorutilizadoparacalcularoresultadodaexpresso.Quandouma
varivelutilizadadoladoesquerdo,seuendereoutilizadoparaarmazenaroresultadodaexpresso
correspondentenamemria.Assim,cadavarivelpossuiumendereodiferenteenico,eosapontadores
sovariveiscapazesdemanipularendereos.

Paradeclararumavariveldotipoponteiroutilizamosaseguinteestrutura:
tipo*nome;

Oasterisco('*')aindicaoqueavarivelnomeumapontador,eoendereoapontadointerpretadocomo
umvalordotipotipo.Portanto,osparmetrosdeentradadafunocomplexo2sonaverdadeapontadores.
Ousodevariveisdetipoapontadorbastantesimples:
intx,y;/*duasvariveisinteiras*/
int*px,*py;/*doisapontadoresparainteiros*/
x=1;/*atribuivarivelxovalor1.*/
y=2;/*atribuivarivelyovalor2.*/
px=&x;/*atribuiaoapontadorpxoenderecodavariavelx.*/
py=&y;/*atribuiaoapontadorpyoenderecodavariavely.*/

Osignificadodasatribuiesacimaoseguinte.Ooperador'&'umoperadorunrio(dedereferncia)que
retornaoendereodeseuoperando.Assim,podemosmanipularoendereoapontadoporumavarivelde
tipoponteiro.

Umoutrooperadorimportanteooperador'*'(operadorunriodereferncia)quedevolveovalorcontido
emumaposiodememriaapontadaporumavariveldetipoponteiro.

Porexemplo:
intx,y;
int*px,*py;
x=1;/*atribuivarivelxovalor1.*/
y=2;/*atribuivarivelyovalor2.*/
px=&x;/*atribuiaoponteiropxoenderecodavariavelx.*/
py=&y;/*atribuiaoponteiropyoenderecodavariavely.*/
printf("Oenderecodexeh%deovalordexeh%d",px,*px);

ondeo*pxsignifica,literalmente,ovalordaposiodememriaapontadoporpx.
Vamosexaminarumoutroexemplodefunesutilizandoapontadores:
voidTroca(int*px,int*py);/*Prototipo.*/

intmain(){
intx=4,y=7;

/**Aochamarafuncaopassamosoendereco
*dasvariaveisxeycomoparametro.
*/
Troca(&x,&y);
printf("Troca:xvale%deyvale%d",x,y);
Troca(&x,&y);
printf("Destroca:xvale%deyvale%d",x,y);

system("pause");
return0;

https://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm 4/6
22/02/2017 Funes:passagemdeparmetros

voidTroca(int*px,int*py)
/*Trocaosvaloresdasvariaveisapontadasporpxepy.*/
{
intn;

n=*py;
*py=*px;
*px=n;
}

AoexaminarmosafunoTroca,verificamosquehouvemanipulaonosvaloresdasposiescujos
endereosforampassadoscomoparmetro.Destemodoqueconseguimosimplementarfunescujaao
estendidaamaisdeumavarivel(ouseja,retornamaisdeumvalor).

Vamosvermaisumexemplo,usandoagoraafunoTrocaemumprogramaparaordenar3inteirosem
ordemcrescente,comoabaixo:

#include<stdio.h>
#include<stdlib.h>

/*prototipo*/
voidTroca(int*px,int*py);

intmain()
{
inta,b,c;

printf("Digite3numerosinteiros:");
scanf("%d%d%d",&a,&b,&c);
if(a>b)Troca(&a,&b);
if(b>c)Troca(&b,&c);
if(a>b)Troca(&a,&b);
printf("Emordemcrescente:%d%d%d\n",a,b,c);

system("pause");
return0;
}

Porexemplo,paraaseqncia321,teramos:

a b c
incio: 3 2 1
1oif: 2 3 1
2oif: 2 1 3
3oif: 1 2 3

eportantoasadaseria
Emordemcrescente:123

Erroscomunscomfunes
Aseguirlistamosalgunserroscomunscometidosquandosecomeaaaprenderfunes.Procureevitalos:

usarscanfdentrodefunesparalerosparmetros
Lembresequeosparmetrossopassadosparaafuno,porvaloroureferncia,nahoradasua
chamada.Essesvaloresnodevemserlidosnovamenteatravsdascanf.
esquecero'&'napassagemdeparmetrosporreferncia
Nessecaso,ovalordavarivelinterpretadocomoumendereo,eafunovaitentarmodificaruma
https://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm 5/6
22/02/2017 Funes:passagemdeparmetros

readamemriaquepodeestarsendousadaporoutroprograma.Nossistemasmodernoshprotees
queimpedemqueesseserrosaconteam.
esquecero'*'nousodeumparmetropassadoporreferncia
Nessecaso,ovalordavarivelumendereoenoumvalor,eosclculosseroportantoinvlidos.
usarumapontadorseminicializar
usarvariveisseminicializaojcausamproblemas,masusarumapontadoresseminicializao
podecausarproblemasaindamaissrios,poisvocpodealterarendereosdamemriaquenoforam
reservadosaoseuprograma,masjestosendoutilizadosporoutrosprogramas.
confundiroescopodevariveiscommesmonome
impressionantequenotenhamospacinciaparaescrevernomesdevariveisquecorrespondama
suafuno,eaoinvsutilizemosletrascomoi,j,k,etc.Assimnodifcilconfundirvariveiscom
mesmonomemasemescoposdiferentes.

EloizaSonoda

https://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm 6/6

Você também pode gostar