Você está na página 1de 7

Cap.

5:
Subprogramas II

- Passagem de Parâmetros

Sumário
 Revisitação à comunicação entre funções
 Entrada e saída de dados de/para uma função
 Modelo de comunicação entre funções
 Tipos de argumentos
 Métodos de passagem de parâmetros
 Métodos de passagem de parâmetros em C
 Alteração do valor duma variável exterior dentro duma função em C

1
O que nós já sabemos sobre
comunicação entre funções
Passagem de parâmetros / argumentos
• É uma operação de entrada de dados.
• Atribuição 1:1 de cada parâmetro concreto (ou valor) a um parâmetro formal
(que é uma variável).

Retorno/Devolução de valor
• É uma operação de saída de dados.
• Uma função devolve sempre um valor, embora possa ser um não-valor (void).

5
n
main 25 quadrado
r q

Exemplo main

#include <stdio.h>
quadrado printf
int quadrado(int);

main()
{
int r;
r = quadrado(5); 5
n
printf("Aqui vai: %i",r); main 25 quadrado
r q
}

int quadrado(int n) Aqui vai:

{ main 25 printf
int q;
q = n * n;
return q;
}
4

2
Entrada e saída de dados para/de
uma função: ponto da situação

Dados de entrada: N

Dados de saída: 1

PROBLEMA:
Não pode haver mais do que 1 dado de saída

SOLUÇÃO:
definir dados de entrada que sejam também de saída

Modelo de comunicação entre


funções
Em princípio, todas as linguagens suportam o seguinte modelo de
comunicação entre funções:

i entradas e j saídas

em que i, j=0, 1,… ,n

3
Tipos de argumentos
Nas várias linguagens de programação, podemos encontrar 3 tipos de
argumentos ou parâmetros:
de entrada
de saída
de entrada e de saída

• Por exemplo, em Pascal, podemos ter funções com qualquer tipo de


parâmetros.

• Mas, em C, as funções só têm parâmetros de entrada.

• No entanto, em C, é possível emular parâmetros de saída e parâmetros


de entrada/saída através de variáveis apontadoras que os referenciam.

Métodos
de passagem de parâmetros
Por valor:
É o único mecanismo de passagem de parâmetros em C, o que
significa que os parâmetros são todos de entrada (de valores).

Os parâmetros reais (efectivos) pertencem ao ambiente da


função invocadora.

Os parâmetros formais pertencem ao ambiente da função


invocada.

Ideia base : qualquer alteração num parâmetro formal não


provoca alteração do parâmetro real correspondente.

4
Métodos
de passagem de parâmetros
Por referência:
Ideia base: Passar a própria variável em vez do seu valor.
Isto implica que alterar o valor dum parâmetro formal implica
alteração idêntica no parâmetro real.

Não existe em C (só em C++) um mecanismo


formal/sintáctico de passagem de parâmetros por referência.

O que se faz é simular este mecanismo através de passagem


de
parâmetros do tipo ponteiro (passagem dum endereço).

Um endereço não é mais do que um valor de uma variável.

Método de passagem de
parâmetros em C
Em C só existe passagem de parâmetros por valor!
Consequências:

NUNCA é possível alterar os argumentos enviados para uma


função, pois sempre que uma função é invocada é criado um ambiente
próprio ou local para a sua execução, para o qual são passadas cópias dos
valores das variávéis, ambiente esse que é destruído logo que a execução
da função termina.

Não é possível mudar o valor duma variável que é passado


como argumento para uma função. Por exemplo, não é possível
trocar os valores de duas variáveis através da chamada duma função que
os recebe como parâmetros de entrada.

Como contornar esta dificuldade?


Apontadores!
10

5
Exemplo incorrecto: troca de
valores de duas variáveis
a x
#include <stdio.h> b y
void swap(int, int); swap

void
main()
{
int a=20, b=30;
swap(a,b); a 20 30 b
printf(“a=%d e b=%d”,a,b);
exit(0);
}
void swap(int x, int y)
{ x 20 30 y
int aux; 30 20
aux=x; x=y; y=aux;
return; 20
} aux 11

Alteração do valor duma variável


exterior dentro duma função em
C
Estratégia:

Em vez de passar o valor duma variável, passa-se o o valor do


seu endereço (através do operador &), que como se sabe é
inalterável.

Se se passa um endereço, há que o receber dentro da função


através duma variável do tipo apontador.

Se dentro da função se usa um apontador, podemos alterar a


variável por ele apontada, isto é, uma variável do ambiente da
função invocadora (que é normalmente a função main).

12

6
Exemplo correcto: troca de
valores de duas variáveis
&a
x
#include <stdio.h> &b y
void swap(int*, int*); swap

void
main()
{
int a=20, b=30;
a b
30
swap(&a,&b); 4048 20 30 4052
20
printf(“a=%d e b=%d”,a,b);
exit(0);
}
void swap(int *x, int *y)
{ x 4048 4052 y
int aux;
aux=*x; *x=*y; *y=aux;
return; 20
} aux 13 FIM