Você está na página 1de 30

ELB21/Aula09

Funções (P2)

Introdução
Aula 09 - Tipos de Passagem de Parâmetros em Linguagem C
Passagem por ELB21 - Programação de Computador
valor

Passagem por
referência

Passagem de Professores: Danillo Leal Belmonte


estruturas
Por valor Edenilson José da Silva
Por referência
João Luiz Rebelatto
Exercícios

Material
Auxiliar
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ
CURSO SUPERIOR DE ENGENHARIA ELETRÔNICA

1 / 15
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor

Passagem por
referência

Passagem de Introdução
estruturas
Por valor
Por referência

Exercícios

Material
Auxiliar

2 / 15
Tipos de Passagens de Parâmetros
ELB21/Aula09

Funções (P2)
tipoRetorno nomeDaFuncao(ListaDeParametros)
Introdução
{
Passagem por
//Corpo da função
valor }
Passagem por
referência

Passagem de
estruturas
Por valor
Por referência
Passagem por valor
Exercícios
Parâmetro recebido/retornado pela função é um valor (int, char, etc).
Material
Auxiliar

Passagem por referência


Parâmetro recebido/retornado pela função é uma referência, isto é, o endereço de
memória de uma variável.

2 / 15
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor

Passagem por
referência

Passagem de Passagem por valor


estruturas
Por valor
Por referência

Exercícios

Material
Auxiliar

3 / 15
Passagem por valor
ELB21/Aula09 Exemplo 8: Função que recebe um inteiro e soma 1 a esse valor.
Funções (P2)
1 #include<stdio.h>
Introdução 2 #include<stdlib.h>
3
Passagem por
valor 4 void somaMaisUm(int n){
5 n = n + 1;
Passagem por
6 printf("DENTRO da funcao: x = %d\n",n);
referência
7 }
Passagem de 8
estruturas
9 int main(){
Por valor
Por referência
10 int x = 5;
11 printf("ANTES da funcao: x = %d\n",x);
Exercícios
12 somaMaisUm(x);
Material 13 printf("DEPOIS da funcao: x = %d \n",x);
Auxiliar 14 return 0;
15 }

3 / 15
Passagem por valor
ELB21/Aula09 Exemplo 8: Função que recebe um inteiro e soma 1 a esse valor.
Funções (P2)
1 #include<stdio.h>
Introdução 2 #include<stdlib.h>
3
Passagem por
valor 4 void somaMaisUm(int n){
5 n = n + 1;
Passagem por
6 printf("DENTRO da funcao: x = %d\n",n);
referência
7 }
Passagem de 8
estruturas
9 int main(){
Por valor
Por referência
10 int x = 5;
11 printf("ANTES da funcao: x = %d\n",x);
Exercícios
12 somaMaisUm(x);
Material 13 printf("DEPOIS da funcao: x = %d \n",x);
Auxiliar 14 return 0;
15 }

3 / 15
Passagem por valor
ELB21/Aula09 Exemplo 8: Função que recebe um inteiro e soma 1 a esse valor.
Funções (P2)
1 #include<stdio.h>
Introdução 2 #include<stdlib.h>
3
Passagem por
valor 4 void somaMaisUm(int n){
5 n = n + 1;
Passagem por
6 printf("DENTRO da funcao: x = %d\n",n);
referência
7 }
Passagem de 8
Variável local, só existe
estruturas
9 int main(){ dentro da função!
Por valor
Por referência
10 int x = 5;
11 printf("ANTES da funcao: x = %d\n",x);
Exercícios
12 somaMaisUm(x);
Material 13 printf("DEPOIS da funcao: x = %d \n",x);
Auxiliar 14 return 0;
15 }

Mesmo que o valor da variável mude dentro da função, nada


acontece onde a função foi chamada.

3 / 15
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor

Passagem por
referência

Passagem de Passagem por referência


estruturas
Por valor
Por referência

Exercícios

Material
Auxiliar

4 / 15
Passagem por referência
ELB21/Aula09

Funções (P2)
Os valores das variáveis não são passados para a função, mas sim os seus
endereços na memória.
Introdução

Passagem por
valor
1 #include<stdio.h>
Passagem por
referência
2 #include<stdlib.h>
Passagem de
3 int main(){
estruturas 4 int x = 5;
Por valor
Por referência
5 printf("Antes do scanf: x = %d\n",x);
Exercícios
6 printf("Digite um numero:");
Material
7 scanf("%d",&x);
Auxiliar 8 printf("Depois do scanf: x = %d\n",x);
9 return 0;
10 }

Exemplo de passagem por referência: função scanf.


4 / 15
ELB21/Aula09

Funções (P2) Para passar um parâmetro por referência, usa-se o operador “*” na frente do
nome do parâmetro durante a declaração da função.
Introdução

Passagem por
valor

Passagem por
referência
Valor Referência
Passagem de 1 void somaMaisUm(int n) 1 void somaMaisUm(int *n)
estruturas
Por valor
2 { 2 {
Por referência
3 n = n + 1; 3 *n = *n + 1;
Exercícios
4 } 4 }
Material
Auxiliar Passagem por valor Passagem por referência

Na chamada da função é necessário utilizar o operador “&” na frente do nome


da variável que será passada por referência.

5 / 15
Passagem por referência
ELB21/Aula09

Funções (P2)

1 #include<stdio.h>
Introdução
2 #include<stdlib.h>
Passagem por 3 void somaMaisUm(int *n){
valor 4 *n = *n + 1;
Passagem por 5 printf("DENTRO da funcao: x = %d\n",*n);
referência 6 }
Passagem de 7
estruturas 8 int main(){
Por valor
Por referência
9 int x = 5;
10 printf("ANTES da funcao: x = %d\n",x);
Exercícios
11 somaMaisUm(&x);
Material 12 printf("DEPOIS da funcao: x = %d \n",x);
Auxiliar
13 return 0;
14 }

6 / 15
Passagem por referência
ELB21/Aula09

Funções (P2)

1 #include<stdio.h>
Introdução
2 #include<stdlib.h>
Passagem por 3 void somaMaisUm(int *n){
valor 4 *n = *n + 1;
Passagem por 5 printf("DENTRO da funcao: x = %d\n",*n);
referência 6 }
Passagem de 7
estruturas 8 int main(){
Por valor
Por referência
9 int x = 5;
10 printf("ANTES da funcao: x = %d\n",x);
Exercícios
11 somaMaisUm(&x);
Material 12 printf("DEPOIS da funcao: x = %d \n",x);
Auxiliar
13 return 0;
14 }

6 / 15
Passagem por referência
ELB21/Aula09

Funções (P2)

1 #include<stdio.h>
Introdução
2 #include<stdlib.h>
Passagem por 3 void somaMaisUm(int *n){
valor 4 *n = *n + 1;
Passagem por 5 printf("DENTRO da funcao: x = %d\n",*n);
referência 6 }
7
Valor de x é alterado diretamente
Passagem de
estruturas 8 int main(){ no seu endereço de memória!
Por valor
Por referência
9 int x = 5;
10 printf("ANTES da funcao: x = %d\n",x);
Exercícios
11 somaMaisUm(&x);
Material 12 printf("DEPOIS da funcao: x = %d \n",x);
Auxiliar
13 return 0;
14 }

Na passagem por referência deve-se usar o operador “*” para


acessar o conteúdo da variável dentro da função.
6 / 15
ELB21/Aula09

Funções (P2)

ATENÇÃO!!
Introdução

Passagem por
valor

Passagem por
referência
Usado para realizar multiplicação
Passagem de
estruturas
Por valor
Por referência
* Usado para declarar uma variável armazenadora de endereço
Usado para retornar o valor contido em um endereço
Exercícios

Material
Auxiliar

& Usado para retornar o endereço de uma variável

7 / 15
Passagem por referência
ELB21/Aula09

Funções (P2) Exemplo 9:


Introdução Função para trocar o conteúdo de duas variáveis.
Passagem por
valor

Passagem por
referência

Passagem de
1 void troca(int A, int B){
estruturas
Por valor
2 int aux = A;
3 A = B; Correto?
Por referência

Exercícios

Material
4 B = aux;
Auxiliar
5 }

8 / 15
Passagem por referência
ELB21/Aula09

Funções (P2) Exemplo 9:


Introdução Função para trocar o conteúdo de duas variáveis.
Passagem por
valor

Passagem por
referência

Passagem de
1 void troca(int A, int B){
estruturas
2 int aux = A;
NÃO!!
Por valor
Por referência
3 A = B;
Exercícios

Material
4 B = aux;
Auxiliar
5 }

Note que A e B são variáveis locais, nada mudaria onde a função troca foi
chamada.

8 / 15
Passagem por referência
ELB21/Aula09

Funções (P2) Exemplo 9:


Introdução
Função para trocar o conteúdo de duas variáveis.
Passagem por
valor

Passagem por
referência

Passagem de
estruturas
1 void troca(int *eA, int *eB){
Por valor
2 int aux = *eA;
Por referência

Exercícios 3 *eA = *eB; SIM!!


Material
Auxiliar 4 *eB = aux;
5 }

8 / 15
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor

Passagem por
referência

Passagem de Passagem de estruturas


estruturas
Por valor
Por referência

Exercícios

Material
Auxiliar

9 / 15
3
4 typedef struct{
Passagem de estrutura por valor 5 char nome[30];
6 int idade;
7 }pessoa;
ELB21/Aula09
Do exemplo 7: Duas funções: i) Para ler do 8
teclado e retornar os dados (nome e
9 void imprimeDados(pessoa p){
Funções (P2)
idade) de uma pessoa; e ii) Para imprimir na tela os
10 dados de uma
printf("Nome: pessoa,
%s",p.nome);
11 printf("Idade: %d\n",p.idade);
Introdução recebidos como parâmetro. Usar struct. 12 }
Passagem por 13
valor
14 pessoa leDados(){
Passagem por 15 pessoa p;
referência 16 printf("Nome: ");
1 #include<stdio.h>
Passagem de 2 #include<stdlib.h> 17 setbuf(stdin,NULL);
estruturas 3 18 fgets(p.nome,30,stdin);
Por valor
4 typedef struct{ 19 printf("Idade: ");
Por referência
5 char nome[30]; 20 scanf("%d",&p.idade);
Exercícios 6 int idade; 21 return p;
Material 7 }pessoa; 22 }
Auxiliar 8 23
9 void imprimeDados(pessoa p){ 24 int main(){
10 printf("Nome: %s",p.nome); 25 pessoa p = leDados();
11 printf("Idade: %d\n",p.idade); 26 imprimeDados(p);
12 } 27 return 0;
13 28 }
14 pessoa leDados(){ Do exemplo 7: estrutura passada por valor.
15 pessoa p;
16 printf("Nome: "); 9 / 15
11 printf("Idade: %d\n",p.idade);
Passagem de12
estrutura
} por referência
13
ELB21/Aula09
14 void leDados(pessoa *p){
Funções (P2)
15 printf("Nome: ");
Introdução 16 setbuf(stdin,NULL);
Passagem por
valor
17 fgets((*p).nome,30,stdin);
Passagem por
18 printf("Idade: ");
referência 19 scanf("%d",&((*p).idade));
Passagem de
estruturas
20 }
Por valor
Por referência
21
Exercícios
22 int main(){
Material 23 pessoa p;
Auxiliar
24 leDados(&p);
25 imprimeDados(p);
26 return 0;
27 }
Função leDados() com parâmetro por referência.
10 / 15
11 printf("Idade: %d\n",p.idade);
Passagem de12
estrutura
} por referência
13
ELB21/Aula09
14 void leDados(pessoa *p){
Funções (P2)
15 printf("Nome: ");
Introdução 16 setbuf(stdin,NULL);
Passagem por
valor
17 fgets((*p).nome,30,stdin);
Passagem por
18 printf("Idade: ");
referência 19 scanf("%d",&((*p).idade));
Passagem de
estruturas
20 }
Por valor
Por referência
21 Função recebe
Exercícios
22 int main(){ endereço de p
Material 23 pessoa p;
Auxiliar
24 leDados(&p);
25 imprimeDados(p);
26 return 0;
27 }
Função leDados() com parâmetro por referência.
10 / 15
11 printf("Idade: %d\n",p.idade);
Passagem de12
estrutura
} por referência
13
ELB21/Aula09
14 void leDados(pessoa *p){
Funções (P2)
15 printf("Nome: ");
Introdução 16 setbuf(stdin,NULL);
Passagem por
valor
17 fgets((*p).nome,30,stdin);
Passagem por
18 printf("Idade: ");
referência 19 scanf("%d",&((*p).idade));
Passagem de
estruturas
20 }
Por valor
Por referência
21
Exercícios
22 Valores são alterados
int main(){
Material 23 pessoa
dentro p;
da função
Auxiliar
24 leDados(&p);
25 imprimeDados(p);
26 return 0;
27 }
Função leDados() com parâmetro por referência.
10 / 15
11 printf("Idade: %d\n",p.idade);
Passagem de12
estrutura
} por referência
13
ELB21/Aula09
14 void leDados(pessoa *p){
Funções (P2)
15 printf("Nome: ");
Introdução 16 setbuf(stdin,NULL);
Passagem por
valor
17 fgets((*p).nome,30,stdin);
Passagem por
18 printf("Idade: ");
referência 19 scanf("%d",&((*p).idade));
Passagem de
20 }
estruturas
Por valor
21
Sem necessidade
int main(){ de retorno
Por referência

Exercícios
22
Material 23 pessoa p;
Auxiliar
24 leDados(&p);
25 imprimeDados(p);
26 return 0;
27 }
Função leDados() com parâmetro por referência.
10 / 15
4 typedef struct{ 4 typedef struct{
O 56operador
char seta
int idade;
->
nome[30]; 5
6
char nome[30];
int idade;
7 }pessoa; 7 }pessoa;
ELB21/Aula09 8 8
Funções (P2) 9 void imprimeDados(pessoa p){ 9 void imprimeDados(pessoa p){
10 printf("Nome: %s",p.nome); 10 printf("Nome:
Utilizado para acessar campos de estruturas passadas %s",p.nome);
por referência.
Introdução 11 printf("Idade: %d\n",p.idade);11 printf("Idade: %d\n",p.idade)
Passagem por
12 } 12 }
valor 13 13
Passagem por 14 void leDados(pessoa *p){ 14 void leDados(pessoa *p){
referência 15 printf("Nome: "); 15 printf("Nome: ");
Passagem de 16 setbuf(stdin,NULL); 16 setbuf(stdin,NULL);
estruturas 17 fgets((*p).nome,30,stdin); 17 fgets(p->nome,30,stdin);
Por valor
Por referência
18 printf("Idade: "); 18 printf("Idade: ");
19 scanf("%d",&((*p).idade)); 19 scanf("%d",&(p->idade));
Exercícios
20 } 20 }
Material 21 21
Auxiliar
22 int main(){ 22 int main(){
23 pessoa p; 23 pessoa p;
24 No exemplo, p->nome
leDados(&p); (*p).nome
é equivalente 24
a .
leDados(&p);
25 imprimeDados(p); 25 imprimeDados(p);
26 return 0; 26 return 0;
27 } 27 }
11 / 15
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor

Passagem por
referência

Passagem de Exercícios
estruturas
Por valor
Por referência

Exercícios

Material
Auxiliar

12 / 15
Exercícios em Sala
ELB21/Aula09

Funções (P2)
Implemente em Linguagem C as funções abaixo, testando-as na parte principal do
Introdução programa.
Passagem por
valor

Passagem por 1) Função void areaquadrado(int lado, int *area), que recebe o valor do
referência

Passagem de
lado de um quadrado, calcula e armazena no endereço apontado por area
estruturas (também recebido como parâmetro) o valor da área do quadrado.
Por valor
Por referência

Exercícios

Material
2) Função void ordena2(int *n1, int *n2), que receba o endereço de dois
Auxiliar inteiros e ordene em ordem crescente o conteúdo destes endereços. Isto é,
após a chamada da função o menor valor deve estar armazenado no endereço
apontado por n1 e o maior no endereço apontado por n2.

12 / 15
Exercícios em Sala - Respostas
ELB21/Aula09

Funções (P2) 1)
1 void areaquadrado(int lado, int* area){
Introdução 2 *area = lado*lado;
Passagem por 3 }
valor

Passagem por
referência 2)
Passagem de
estruturas
1 void ordena2(int *n1, int *n2){
Por valor 2 int aux;
Por referência
3 if(*n1>*n2){
Exercícios 4 aux = *n1;
Material 5 *n1 = *n2;
Auxiliar
6 *n2 = aux;
7 }
8 }

13 / 15
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor

Passagem por
referência

Passagem de Material Auxiliar


estruturas
Por valor
Por referência

Exercícios

Material
Auxiliar

14 / 15
Material Auxiliar
ELB21/Aula09

Funções (P2)

Introdução

Passagem por
valor Aulas no YouTube (by Prof. André Backes):
Passagem por
referência

Passagem de
estruturas
Por valor
Por referência

Exercícios passagem por referência


Material
Auxiliar

14 / 15
Bibliografia
ELB21/Aula09

Funções (P2)

Introdução

Passagem por Herbert Schildt. “C Completo e Total”. 3ª Edição, Makron Books,


valor
1996.
Passagem por
referência

Passagem de
estruturas
Por valor
Por referência

Exercícios
→ Livro disponível na biblioteca da UTFPR!
Material
Auxiliar

15 / 15

Você também pode gostar