Vous êtes sur la page 1sur 4

Passagem de Parmetros em C/C++

Prof. Celso Maciel da Costa

A passagem de parmetros em C/C++ pode ser por valor ou por referncia. Por valor, existe uma cpia dos valores das variveis utilizadas na chamada da funo para os parmetros formais da funo. No exemplo abaixo, as variveis x e n no ocupam a mesma posicao de memoria. Modificaes feitas em n no alteram o valor de x, da mesma forma que modificaes feitas em x no alteram o valor de n. #include <stdio.h> int testePar (int n) { n = n + 5 ; return n; } int main() { int r, x=7 ; r = testePar (x) ; printf ("Main: Valor de x: %d\n",n) ; printf ("Main: Valor de r: %d\n",r) ; } No primeiro printf dever aparecer o seguinte resultado: Main: Valor de n: 0 e no segundo printf aparecer:

Main: Valor de r: 12

Na passagem do exemplo, endereo da modificar x modificar n

de parmetros por referncia (endereo), as variaveis x e n, ocupam a mesma posicao de memoria. passado para a funo o varivel utilizada na chamada da funo. Assim sendo, ao se tambm se estar modificando n, da mesma forma que ao se tambm se estar modificando x.

#include <stdio.h> int testePar (int &n) { n = n + 5 ; printf (" Valor de n modificado: %d\n", n) ; return n; } int main() { int r, x=7 ; r = testePar (x) ; printf ("Main: Valor de x: %d\n",n) ; printf ("Main: Valor de r: %d\n",r) ; }

No exemplo acima, na funo testPar ser impresso o valor 12, resultado da soma do valor anterior, 7 com o valor 5. Na funo main, o valor de x, impresso no primeiro printf, 12, resultado da alterao realizada pela funo testePar. Como x e n ocupam o mesmo endereo de memria, possuem o mesmo valor. Como existe uma cpia do valor de n para a varivel r do main, resultado da operao return n executada na funo testPar, o valor de r igual ao valor de x. A passagem de parmetros por endereo suportada somente por C++, e indicada pelo smbolo &. Para a compilao de programas em C++ pode ser utilizado o compilador g++. A linguagem C somente suporta passagem de parmetros por valor. Vetores e matrizes so sempre passados por referncia, nas linguagens C e C++. No exemplo abaixo, todos elementos do vetor V, definido no main, receberam o valor zero. O endereo deste vetor foi passado para a funo testVetPar, onde todos os elementos receberam o valor quatro. Desta forma, o vetor x e o vetor V se referem as mesmas posies de memria. Os valores que sero impressos na funo testVetPar e main sero os mesmos. #include <stdio.h> void testeVetPar (int x[3]) { x[0] = x[1] = x[2] = printf printf printf } int main() { int v[3] ; v[0] = 0 ; v[1] = 0 ; v[2] = 0 ; testeVetPar (v) ; printf ("Main: Valor de v[0]: %d\n", v[0]) ; printf ("main: Valor de v[1]: %d\n", v[1]) ; printf ("Main: Valor de v[2] : %d\n",v[2]) ; } Em C, dados relacionados, de tipos diferentes, podem ser agrupados em uma estrutura chamada struct. Esta estrutura possui um nome, e os dados que pertencem a esta estrutura podem ser acessados individualmente. Por exemplo, uma conta bancria possui um nmero inteiro num e um saldo (float). A definio, em C desta struct feita como apresentado a seguir. struct conta { int num ; float saldo ; } ; A definio acima representa um tipo de dados. Agora possvel definir variveis do tipo conta: 4 ; 4 ; 4 ; ("Valor de x[0] modificado: %d\n", x[0]) ; ("Valor de x[1] modificado: %d\n", x[1]) ; ("Valor de x[2] modificado: %d\n", x[2]) ;

struct conta c; Acima foi definida uma varivel c, que possui os campos num e saldo. O acesso a cada componente da varivel c feito separando o nome da varivel do nome do componente comum . (ponto). Ex.: c.num = 0 ; c.saldo = 0.0 ;

A passagem de structs como parmetros segue as mesmas regras apresentadas anteriormente. Uma struct pode ser passada por valor ou por referncia, e um vetor de structs sempre passado por referncia. O exemplo a seguir apresenta um programa no qual foi definida a struct conta e, no main, uma varivel c do tipo conta. Foi tambm definida uma funo, testeStructPar, que recebe a struct c, definida no main, usando-se passagem de parmetros por valor. Assim sendo, os valores impressos no main sero, respectivamente, 0 e 0.0 e na funo testeStructPar 2 e 20.0.

#include <stdio.h> struct conta { int num ; float saldo ; } ; void testeStructPar (struct conta x) { x.num = 2 ; x.saldo = 20.0 ; printf ("TestPar: Valor de c.num: %d\n", c.num) ; printf ("TestPar: Valor de c.saldo: %.1f\n", c.saldo) ; } int main() { struct conta c; c.num = 0 ; c.saldo = 0.0 ; testeStructPar (c) ; printf ("Main: Valor de c.num: %d\n", c.num) ; printf ("main: Valor de c.saldo: %.1f\n", c.saldo) ; } Se utilizarmos a passagem de parmetros por referncia, redefinindo a funo para void testeStructPar (struct conta &x), os valores impressos no main e na funo testeStructPar sero os mesmos. No programa a seguir foi definido no main um vetor c[2], do tipo conta, passado como parmetro para a funo testeStructPar. Como a passagem de vetores como parmetro sempre por referncia, os valores impressos no main e na funo sero os mesmos. #include <stdio.h> struct conta { int num ;

float saldo ; } ; void testeStructPar (struct conta x[2]) { x[0].num = x[0].saldo x[1].num = x[1].saldo } int main() { struct conta c[2]; c[0].num = c[0].saldo c[1].num = c[1].saldo 0 = 0 = ; 0.0 ; ; 0.0 ; (c) ; Valor Valor Valor Valor 2 = 3 = ; 20.0 ; ; 30.0 ;

testeStructPar printf ("Main: printf ("main: printf ("Main: printf ("main:

de de de de

c.num: %d\n", c[0].num) ; c.saldo: %.1f\n",c[0].saldo) ; c.num: %d\n", c[1].num) ; c.saldo: %.1f\n",c[1].saldo) ;

j}

Vous aimerez peut-être aussi