Sei sulla pagina 1di 27

Memria e Ponteiros

Prof. Dr. Orlando de Andrade Figueiredo


SCC0122, Estruturas de Dados, USP/So Carlos, 2013

Plano
Programao em baixo nvel de abstrao
Em alto nvel
Em mdio nvel
Exemplo: percorrer um array alterando
valores

Programao em Baixo
Nvel de Abstrao
Modelo da Mquina (Processador)
Linguagem de programao:
Linguagem de mquina (ou cdigo de mquina)
Linguagem prxima:
Linguagem de montagem (em ingls, Assembly)
Modelo de espao de dados
Modelo de memria, com endereos e contedos

Memria
Como uma tabela
Coluna 1: endereos
Coluna 2: contedos
armazenados

86

725

90

122

...

...

Operaes em
Memria
Leitura do contedo
de uma posio a
partir do endereo
ctd_e (x)
Endereo

Contedo
ctd_e

90

86

725

90

122

...

...

Operaes em
Memria
Endereo
Contedo

a_ctd_e

Alterao do contedo de uma


posio a partir do endereo e
do novo valor
a_ctd_e (x,y)

33

86

725

33

122

...

...

Metfora
A memria como um tabuleiro
de cartas de baralho
Os endereos das posies
no tabuleiro so os valores
das cartas pretas
Os dados comuns so cartas
vermelhas
Cartas pretas tambm podem
ocupar posies, mas tm um
significado diferenciado

Programao em Alto
Nvel de Abstrao
Espao de dados
Variveis, com nomes e
contedos
Operaes
ctd_n(x)
a_ctd_n(x,y)

Programao em Mdio
Nvel de Abstrao
Linguagens de programao: C
Espao de dados
Nomes
Endereos
No aparecem como valores constantes
Podem ser valores de variveis especiais (ponteiros)
Contedos

Metfora
Um tabuleiro em que os endereos esto
presentes, mas que no olhamos
diretamente.
Endereos tambm esto presentes, mas
eles tm uma correspondncia estreita com
os nomes.

Nome

Operaes
ctd_e(x)

end_n

a_ctd_e(x,y)
ctd_n(x)
a_ctd_n(x,y)
end_n(x)

Endereo

Exemplo: Percorrer
Array Alterando Valores
Programa preenche array de 6 posies, inicializando-o com os valores AC
(s de copas), 2C, 3C, 4C, 5C, 6C
Duas variveis
Contador, para gerar os valores ascendentes a serem preenchidos
Ponteiro, para percorrer o array
Trs verses
Baixo nvel, notao prpria
Mdio nvel, notao prpria
Mdio nvel, notao da linguagem C

Verso em Baixo Nvel


Escolha manual e arbitrria das posies de
memria para o array e as duas variveis
O array inicia no endereo 3 e prossegue
contiguamente at o endereo 8
O contador fica em 10, que pode ser
referenciado tanto como 10E (espadas) quanto
10P (paus)
O ponteiro fica em J (JE ou JP)

Inicializao de Variveis

a_ctd_e(10P,AC)
a_ctd_e(JE,3P)

Aes no Lao

a_ctd_e(ctd_e(JE),ctd_e(10P))
a_ctd_e(10P,soma(ctd_e(10P),1))
a_ctd_e(JE,soma(ctd_e(JE),1))

Finalizao do Lao

a_ctd_e(ctd_e(JE),ctd_e(10P))
a_ctd_e(10P,soma(ctd_e(10P),1))
a_ctd_e(JE,soma(ctd_e(JE),1))
if ctd_e(JE) <= 8 voltar 3 instrues

Programa Completo em Baixo Nvel

a_ctd_e(10P,AC)
a_ctd_e(JE,3P)
a_ctd_e(ctd_e(JE),ctd_e(10P))
a_ctd_e(10P,soma(ctd_e(10P),1))
a_ctd_e(JE,soma(ctd_e(JE),1))
if ctd_e(JE) <= 8 voltar 3 instrues

Verso em Mdio Nvel

Variveis
O array declarado com 6 posies, nomeado "a"
O contador declarado, nomeado "c"
O ponteiro declarado, nomeado "p"

Inicializao das Variveis

a_ctd_n(c,AC)
a_ctd_n(p,end_n(a))

Aes no Lao

a_ctd_e(ctd_n(p),ctd_n(c))
a_ctd_n(c,ctd_n(c)+1)
a_ctd_n(p,ctd_n(p)+1)

Finalizao do Lao

while(ctd_n(p)<=end_n(a)+5)

Programa Final em Mdio Nvel


a_ctd_e(10P,AC)

;; declaraes omitidas

a_ctd_e(JE,3P)

do {

a_ctd_e(ctd_n(p),ctd_n(c))

a_ctd_e(ctd_e(JE),ctd_e(10P))

a_ctd_n(c,ctd_n(c)+1)

a_ctd_e(10P,soma(ctd_e(10P),1))

a_ctd_n(p,ctd_n(p)+1)

a_ctd_e(JE,soma(ctd_e(JE),1))

} while(ctd_n(p)<=end_n(a)+5)

if ctd_e(JE) <= 8 voltar 3


instrues

Traduo para a Linguagem C

ctd_e(ctd_n(x))

..=.. *x ..

a_ctd_e(ctd_n(x),..) *x=..
ctd_n(x)

..=.. x ..

a_ctd_n(x,..)

x=..

end_n(x)

..=.. &x ..

Verso em C
carta a[6]; //ou:

carta *a

carta c;
carta *p;

;; declaraes omitidas

do {

do {

*p=c;

a_ctd_e(ctd_n(p),ctd_n(c))

c=c+1;

a_ctd_n(c,ctd_n(c)+1)

p=p+1;

a_ctd_n(p,ctd_n(p)+1)

} while(p<=&a+5)

} while(ctd_n(p)<=end_n(a)+5)

O que ser que


acontece?
x=*(&i)
y=&(*p)

Exerccios

Copiar uma array invertendo a sequencia dos valores


Dica: percorrer o array original de trs para frente.
Como o ponteiro apontando para o final do array?
Determinar se a sequencia contida em um array um
palndromo.
(SOCORRAMMESUBINOONIBUSEMMARROCOS)

Potrebbero piacerti anche