Download - Memória e Ponteiros
-
8/18/2019 Memória e Ponteiros
1/27
Memória e PonteirosProf. Dr. Orlando de Andrade FigueiredoSCC0122, Estruturas de Dados, USP/São Carlos, 2013
-
8/18/2019 Memória e Ponteiros
2/27
Plano
• Programação em baixo nível de abstração
• Em alto nível
• Em médio nível
• Exemplo: percorrer um array alterandovalores
-
8/18/2019 Memória e Ponteiros
3/27
Programação em Baixo
Nível de Abstração• Modelo da Máquina (Processador)• Linguagem de programação:
• Linguagem de máquina (ou código de máquina)
• Linguagem próxima:
• Linguagem de montagem (em inglês, Assembly )
• Modelo de espaço de dados
• Modelo de memória, com endereços e conteúdos
-
8/18/2019 Memória e Ponteiros
4/27
Memória
• Como uma tabela
• Coluna 1: endereços
• Coluna 2: conteúdosarmazenados
0 861 725
2 90
3 122
... ...
-
8/18/2019 Memória e Ponteiros
5/27
0 861 725
2 90
3 122
... ...
Operações em
Memória• Leitura do conteúdo
de uma posição a
partir do endereço• ctd_e (x)
2
90
-
8/18/2019 Memória e Ponteiros
6/27
0 861 725
2 33
3 122
... ...
Operações em
Memória
• Alteração do conteúdo de umaposição a partir do endereço edo novo valor
• a_ctd_e (x,y)
2
33
-
8/18/2019 Memória e Ponteiros
7/27
Metáfora• A memória como um tabuleiro
de cartas de baralho
• Os endereços das posiçõesno tabuleiro são os valoresdas cartas pretas
• Os dados comuns são cartasvermelhas
• Cartas pretas também podemocupar posições, mas têm umsignificado diferenciado
-
8/18/2019 Memória e Ponteiros
8/27
-
8/18/2019 Memória e Ponteiros
9/27
Programação em Médio
Nível de Abstração• Linguagens de programação: C• Espaço de dados
• Nomes
• Endereços
• Não aparecem como valores constantes
• Podem ser valores de variáveis especiais (ponteiros)
• Conteúdos
-
8/18/2019 Memória e Ponteiros
10/27
Metáfora
• Um tabuleiro em que os endereços estão
presentes, mas que não olhamosdiretamente.
• Endereços também estão presentes, mas
eles têm uma correspondência estreita comos nomes.
-
8/18/2019 Memória e Ponteiros
11/27
-
8/18/2019 Memória e Ponteiros
12/27
Operações• ctd_ e (x)
• a_ctd_ e (x,y)
• ctd_ n (x)
• a_ctd_ n (x,y)
• end_n (x)
-
8/18/2019 Memória e Ponteiros
13/27
Exemplo: Percorrer
Array Alterando Valores• Programa preenche array de 6 posições, inicializando-o com os valores AC(ás de copas), 2C, 3C, 4C, 5C, 6C
• Duas variáveis
• Contador, para gerar os valores ascendentes a serem preenchidos
• Ponteiro, para percorrer o array
• Três versões
• Baixo nível, notação própria
• Médio nível, notação própria
• Médio nível, notação da linguagem C
-
8/18/2019 Memória e Ponteiros
14/27
Versão em Baixo Nível• Escolha manual e arbitrária das posições de
memória para o array e as duas variáveis
• O array inicia no endereço 3 e prosseguecontiguamente até o endereço 8
• O contador fica em 10, que pode ser
referenciado tanto como 10E (espadas) quanto10P (paus)
• O ponteiro fica em J (JE ou JP)
-
8/18/2019 Memória e Ponteiros
15/27
Inicialização de Variáveis
a_ctd_e(10P,AC)
a_ctd_e(JE,3P)
-
8/18/2019 Memória e Ponteiros
16/27
Ações no Laço
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))
-
8/18/2019 Memória e Ponteiros
17/27
Finalização do Laço
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/18/2019 Memória e Ponteiros
18/27
Programa Completo em Baixo Nível
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/18/2019 Memória e Ponteiros
19/27
Versão em Médio Nível
• Variáveis
• O array é declarado com 6 posições, nomeado "a"
• O contador é declarado, nomeado "c"
• O ponteiro é declarado, nomeado "p"
-
8/18/2019 Memória e Ponteiros
20/27
Inicialização das Variáveis
a_ctd_ n (c,AC)
a_ctd_ n (p,end_n(a))
-
8/18/2019 Memória e Ponteiros
21/27
Ações no Laço
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)
-
8/18/2019 Memória e Ponteiros
22/27
Finalização do Laço
while(ctd_ n (p)
-
8/18/2019 Memória e Ponteiros
23/27
Programa Final em Médio Nível
;; declarações omitidas
do {
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)
} while(ctd_ n (p)
-
8/18/2019 Memória e Ponteiros
24/27
Tradução para a Linguagem C
• ctd_ e (ctd_ n (x))
• a_ctd_ e (ctd_ n (x),..)
• ctd_ n (x)
• a_ctd_ n (x,..) • end_n (x)
• ..=.. *x ..
• *x=.. • ..=.. x ..
• x=..
• ..=.. &x ..
-
8/18/2019 Memória e Ponteiros
25/27
Versão em C
;; declarações omitidas
do {
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)
} while(ctd_ n (p)
-
8/18/2019 Memória e Ponteiros
26/27
O que será que
acontece?
• x=*(&i)
• y=&(*p)
-
8/18/2019 Memória e Ponteiros
27/27
Exercícios
• Copiar uma array invertendo a sequencia dos valores
• Dica: percorrer o array original de trás para frente.Como o ponteiro apontando para o final do array?
• Determinar se a sequencia contida em um array é umpalíndromo.(SOCORRAMMESUBINOONIBUSEMMARROCOS)