memória e ponteiros

Upload: lala

Post on 07-Jul-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 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)