Você está na página 1de 38

Estrutura de Dados

Curso: Informática
Profa. Evaldinolia Gilbertoni Moreira
Email: evaldinolia@acad.ifma.edu.br
Roteiro
1. Ponteiros
2. Funções passagem por valor e por referência

Passagem de
Parâmetros
Existem duas formas de passagem de parâmetros quando se chama uma
função:
por valor e por referência
Os endereços das variáveis que são
passadas para a função são copiados
nos parâmetros formais

Os valores das variáveis que são


passadas para a função são copiados
nos parâmetros formais. As alterações são feitas diretamente nas
variáveis originais.

As alterações feitas nesses valores não se


refletem nas variáveis originais. Aqui usamos ponteiros nos parâmetros
Passagem de Parâmetros por Valor

Chamada da
função
Passagem de Parâmetros por Valor

O valor das variáveis x e


y são copiados para o
parâmetros a e b da
função somaDobro.
Passagem de Parâmetros por Valor
O valor das variáveis é
alterado no corpo da
função.
Passagem de Parâmetros por Valor

O valor da variável
local soma é retornado
para a função
chamadora

Passagem
de
Parâmetro por Valor Função main
Função soma_dobro
5*2=10
5 3
x y a 5

a 10
res = soma_dobro(5,3)
3 b
6 soma
x
5 y
16
b
3 res 16
3*2=6 return soma
Passagem de Parâmetros por Referência

Os parâmetros
passados para a
função são os
endereços das variáveis
xey
Passagem de Parâmetros por Referência
Os parâmetros são
PONTEIROS
Ponteiros são variáveis
que designam
endereços de memória
As variáveis do tipo
ponteiro são declaradas
para um determinado tipo

Ponteiros
Declaração

SINTAXE
tipoDoPonteiro *nomeDaVariável;
✓ É o asterisco (*) que faz o compilador saber
que aquela variável não vai guardar um valor
mas
sim um endereço para aquele tipo especificado

Ponteiros
Usando Ponteiros
▪ Para atribuir um valor a um ponteiro recém-criado podemos igualá-lo a um valor de memória.
pt = &count;
Declaração da variável
ponteiro para int.
int count =
Atribuição do endereço da
10; int *pt; variável count ao ponteiro.
✓ O ponteiro deve ser inicializado (apontado para
algum lugar conhecido) antes de ser usado.

Ponteiros
Operador de Endereços (&)

O & é um
operador
unário que devolve o endereço de memória do seu
operando.
m = &count;

Ponteiros
Operador de Acesso Indireto (*)

O * é um
operador
unário que devolve o valor da variável localizada
no endereço que o segue.

m = &count;
q = *m;

✓ O operador endereço (&) somente pode ser


usado em uma única variável.
✓ O operador conteúdo (*) somente pode ser
usado em variáveis ponteiros.
Passagem de Parâmetros por Referência
Ao usar o operador * sabe-se
que estamos trabalhando
com os conteúdos das
variáveis referenciadas pelos
ponteiros

*a == conteúdo de x
*b == conteúdo de y
Passagem de Parâmetros por Referência

O valor da variável soma é


retornado ao chamador da
função, porém as variáveis x e
y tiveram seus valores
alterados.

Passagem de Parâmetros por Referência


Função main Função soma_dobro
5 300 800 300
x y 800
5*2=10 3*2=6
a b
3
res = 300
soma_dobro(800,300
)

x 10
10
800
6
y 6
16 soma 16
res soma
return
Passagem de Parâmetros
Passagem de parâmetros (dois tipos):
▪ por valor
▪ por referência (passar o endereço da variável)

Estratégias adotadas pelas linguagens:


▪ Todo é feito por referência (FORTRAN, PL/1)
▪ Temos a escolha entre a passagem por valor
ou por referência (caso de PASCAL)
▪ Toda passagem é feita por valor (caso de C)

Exemplo em c++ chamada da função

A função troca
int temp; }
int main()
&y)
temp=x; {
void troca (int &x,
int x=y; int a=5,b=8;
y=temp;
{
printf("%d %d", a,
b); }

troca(a,b);

Estratégia de C
Em C, toda passagem de parâmetros é portanto feita por valor!

Como então fazer as passagens por referência?


Solução é de declarar os parâmetros formais de tipo ponteiro. Isto é
feito pelo uso do operador & (usado na chamada a função).

x=y;
y=temp;
}

Exemplo 1 em c
A função troca (passagem por
valor)
chamada da função
void troca (int x, int y)
{ int main(){
int temp; int a=5,b=8;
temp=x;
troca(a,b);/* passagem por
valor */
}
printf("%d %d", a, b);
*y=temp;
}

Exemplo 2
A função troca (passagem por
referência) chamada da função

void troca (int * x, int * y) { troca(&a,&b);


int temp; /* passagem por referência */
temp=*x;
*x=*y;
Exemplo 3
void adicionar (int a, int b, int * res)
{
*res=a+b; (i,j,&k); }
} observe a declaração de res
como um ponteiro sobre um
inteiro: um endereço

void main (void)


observe que na chamada tem
{ que passar o endereço da
int i=10,j=5,k; variável onde deseja-se
recuperar o resultado
adicionar
▪ Tipo de dado
▪ Conteúdo
▪ Endereço – operador & Idade

Apontando para
uma variável

int

19
Declaração de
5DF1
variável:
▪ Nome do Identificador
Idade&Idade

Apontando para

uma variável

int idade;

idade = 19;
Tipo de dado
idade int
Conteúdo
19
Endereço (memória)
5DF1
Nome do identificador

Acessa-se o conteúdo através do nome da variável

Apontando para uma variável


int *
idade int

19
2F09
5DF1
Nome do identificador

Tipo de dado
Nome do identificador

Conteúdo Tipo de dado

Endereço (memória)
Conteúdo

Endereço (memória)
ptrIdade

Acessa-se o conteúdo através de ponteiro

Apontando para
uma variável

int * ptrIdade;
int idade;

5DF1
ptrIdade =
ptrIdade
&idade;
Conteúdo
*ptrIdade = 19; int *
Endereço (memória)
idade 19
Apontando para

uma variável

int * ptrIdade;
int idade;

Idade
ptrIdade =
&idade;
*ptrIdade = 19; 19
PtrIdade

int *

Você também pode gostar