Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Ponteiros e alocação de memória em programação estruturada, Notas de aula de Informática

Este documento aborda o conceito de ponteiros e alocação de memória em programação estruturada, discutindo as vantagens e desvantagens da alocação estática e dinâmica, a sintaxe e definição de ponteiros, alocação e desalocação de ponteiros, e acesso a conteúdos apontados por ponteiros. Além disso, é apresentado o uso de ponteiros para registros e a implementação de listas estáticas e dinâmicas.

Tipologia: Notas de aula

Antes de 2010

Compartilhado em 01/03/2010

ygor-dos-santos-luz-3
ygor-dos-santos-luz-3 🇧🇷

4.7

(3)

55 documentos

1 / 9

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
1
Algoritmos e Estruturas de Dados
Prof. Patrick Pedreira
Ponteiros
Ponteiros
Ponteiros
Ponteiros
Alocação estática
Estruturas de tamanho predefinido
os valores sempre foram definidos na construção do programa ou
em tempo de compilação.
Esse tipo de alocação pode implicar desperdício de recursos
nem sempre é possível determinar qual o espaço necessário para
armazenar todas as informações que o programa utilizará.
Por exemplo, armazenar dados dos alunos de uma sala de aula
Perda de espaço em caso de super-dimensionamento das
necessidades de armazenamento ou em caso de subestimar o
tamanho necessário para armazenar os dados.
Por isso, geralmente os programadores preferem superestimar o
tamanho dos vetores, mesmo que isso signifique perda de espaço.
Chamamos esse tipo de alocação de estática.
Ponteiros
Ponteiros
Alocação Dinâmica
Na alocação dinâmica, os espaços são alocados
durante a execução do programa.
conforme o programa necessitar de memória, alocará os
espaços.
Não há reserva antecipada de espaço, pelo contrário, o
espaço é ocupado sob demanda.
Com essa abordagem, resolvemos o principal problema
encontrado na alocação estática: o dimensionamento de
espaço.
Como não precisamos determinar o tamanho das estruturas,
não corremos o risco de subestimá-las. Conseqüentemente,
também não precisaremos superestimar o tamanho dos
vetores por precaução.
Ponteiros
Ponteiros
Definição de ponteiros
Ponteiros (ou apontadores) são variáveis que
armazenam um endereço de memória.
Portanto, podemos considerar endereços de memória
como um tipo de dados.
Quando utilizamos outros tipos de variáveis,
trabalhamos com o conteúdo de um endereço de
memória.
com os ponteiros, acessamos o próprio endereço da
memória, e não seu conteúdo.
Os ponteiros apontam para uma variável de um
determinado tipo. Assim, podemos ter ponteiros para
variáveis inteiras, caracteres, booleanas ou reais.
Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
pf3
pf4
pf5
pf8
pf9

Pré-visualização parcial do texto

Baixe Ponteiros e alocação de memória em programação estruturada e outras Notas de aula em PDF para Informática, somente na Docsity!

Algoritmos e Estruturas de Dados

Prof. Patrick Pedreira

Ponteiros Ponteiros

PonteirosPonteiros

 Alocação estática

 Estruturas de tamanho predefinido

 os valores sempre foram definidos na construção do programa ou em tempo de compilação.

 Esse tipo de alocação pode implicar desperdício de recursos

 nem sempre é possível determinar qual o espaço necessário para armazenar todas as informações que o programa utilizará.

 Por exemplo, armazenar dados dos alunos de uma sala de aula

 Perda de espaço em caso de super-dimensionamento das necessidades de armazenamento ou em caso de subestimar o tamanho necessário para armazenar os dados.

 Por isso, geralmente os programadores preferem superestimar o tamanho dos vetores, mesmo que isso signifique perda de espaço.

 Chamamos esse tipo de alocação de estática.

PonteirosPonteiros

 Alocação Dinâmica

 Na alocação dinâmica, os espaços são alocados

durante a execução do programa.

 conforme o programa necessitar de memória, alocará os espaços.

 Não há reserva antecipada de espaço, pelo contrário, o espaço é ocupado sob demanda.

 Com essa abordagem, resolvemos o principal problema encontrado na alocação estática: o dimensionamento de espaço.

  • Como não precisamos determinar o tamanho das estruturas, não corremos o risco de subestimá-las. Conseqüentemente, também não precisaremos superestimar o tamanho dos vetores por precaução.

PonteirosPonteiros

 Definição de ponteiros

 Ponteiros (ou apontadores) são variáveis que

armazenam um endereço de memória.

 Portanto, podemos considerar endereços de memória

como um tipo de dados.

 Quando utilizamos outros tipos de variáveis,

trabalhamos com o conteúdo de um endereço de

memória.

 Já com os ponteiros, acessamos o próprio endereço da memória, e não seu conteúdo.

 Os ponteiros apontam para uma variável de um

determinado tipo. Assim, podemos ter ponteiros para

variáveis inteiras, caracteres, booleanas ou reais.

 Sintaxe

 *: <tipo da variável apontada>

 Exemplos: *p1: real; *p2: inteiro; *p3: caractere;

 O simbolo * indica que a variável é um ponteiro.

 Na passagem de parâmetros por referência, já

trabalhamos com ponteiros, pois o endereço da

variável era passado na ativação do módulo, e não

seu conteúdo. Exemplo:

 Ordena(ref v1, ref v2, tp);

 A declaração do ponteiro pode ser vista no cabeçalho

do módulo Ordena:

 booleano Ordena(ref valor1: real, ref valor2: Real, opção: inteiro)

Porém, na passagem de parâmetros por

referência (exemplo anterior) não deixamos

explícito a utilização dos ponteiros.

Essa abordagem que também é utilizada em

algumas linguagens de programação, como

Pascal.

Já a linguagem C implementa a passagem de

parâmetros por referência explicitamente por

meio de ponteiros.

“Mas qual a relação entre os ponteiros e a

alocação dinâmica?”.

 Na passagem de parâmetros por referência, não há

alocação dinâmica, pois a variável passada como

argumento na ativação já estava alocada

PonteirosPonteiros

 Porém, em qualquer outra situação diferente da passagem de parâmetros por referência, necessitaremos de um passo intermediário para utilizar os ponteiros.

 Isto ocorre porque os ponteiros, quando declarados, apontam para uma área não determinada/reservada da memória.

 Para que o ponteiro possa apontar para uma área utilizável, é necessário alocar tal área. Essa alocação é feita por meio do comando aloque:

 aloque()

  ApApóós a execus a execuçção do comandoão do comando aloque aloque,, o ponteiro passaro ponteiro passaráá aa apontar para uma apontar para uma áárea definida da memrea definida da memóória capaz de armazenarria capaz de armazenar uma vari uma variáável de determinado tipo. Vejamos:vel de determinado tipo. Vejamos: *p1: real; *p1: real; *p2: inteiro; *p2: inteiro; *p3: caractere; *p3: caractere; aloque(p1); aloque(p1); {aloca o espa{aloca o espaçço para o ponteiro p1 definido acima}o para o ponteiro p1 definido acima} aloque(p2); aloque(p2); aloque(p3); aloque(p3);

PonteirosPonteiros

 Quando utilizamos o comando aloque , estamos implementando a alocação dinâmica propriamente dita.

 Quando o programa executar o comando, será reservado o espaço solicitado para uso e não no início da execução do programa.

 Caso a linha que contenha o comando aloque não seja executada, tal área não será alocada.

 Para acessar o conteúdo apontado pelo ponteiro, é necessário utilizar o símbolo “*”

 *p110.3;

 *p25;

 *p3‘a’;

 O ponteiro precedido pelo caractere * funciona exatamente como uma variável.

 Não poderemos inserir valores de tipos incompatíveis nos espaços apontados pelos ponteiros: *p2: inteiro; aloque(p2); *p2‘a’; { Errado } *p25; { Certo }

 Podemos também definir um tipo ponteiro

 Podemos utilizar dentro dos registros campos que sejam ponteiros

 Neste exemplo, acessamos os campos do segundo registro alocado por meio do encadeamento do ponteiro para o registro (Aluno1) com o campo ponteiro dentro do registro (Prox): Aluno1->Prox->matricula

PonteirosPonteiros

Podemos atribuir uma variável ponteiro a outra:

PonteirosPonteiros

 Nesse trecho de cNesse trecho de cóódigo,digo,

alocamos informaalocamos informaççõesões referentes a dois alunos.referentes a dois alunos. Entretanto, ao atribuirmosEntretanto, ao atribuirmos

Aluno1Aluno1-->>ProxProx^ a Aluno1 (linhaa Aluno1 (linha 6), perdemos o endere6), perdemos o endereçço doo do aluno com matraluno com matríícula 28322 ecula 28322 e não temos mais como recupernão temos mais como recuperáá--

lo. Por isso, temos de tomarlo. Por isso, temos de tomar cuidado especial com esse tipocuidado especial com esse tipo de situade situaçção.ão.

Um problema comum na utilização de ponteiros

é a perda de um endereço utilizado e, por

consequência, de seu conteúdo

 Estrutura vista

 Estruturas de dados avançadas

 Várias estruturas de dados podem ser representadas

tanto de forma estática como dinâmica.

 Ambas as formas têm suas vantagens e desvantagens.

 Ao criarmos uma estrutura de dados e um conjunto de

operações que se definem sobre essa estrutura,

podemos considerar, conceitualmente, que temos um

tipo. Porém, não é um tipo implementado diretamente

na linguagem de programação, mas um tipo abstrato

de dados (TAD).

 A seguir, as operações que estudaremos sobre as

estruturas definidas:

1. Iniciação

2. Inserção

3. Remoção

4. Busca

5. Término

PonteirosPonteiros

 Listas estáticas e dinâmicas

 As listas consistem em um conjunto de elementos do

mesmo tipo.

 Exemplo: uma lista de livros

 Uma lista de livros estática pode ser representada por

meio de um vetor de registros, e cada registro

representa um livro

 Uma boa analogia seria imaginarmos uma estante de livros. Para armazenarmos livros em nossa casa, a solução mais óbvia seria a utilização de uma estante. Então, após estimarmos a quantidade de livros que teremos, compramos uma estante que seja capaz de guardá-los em qualquer momento, mesmo que no início tenhamos pouca quantidade deles.

 Esta abordagem é bastante simples e intuitiva. As desvantagens iniciais são: problemas na estimativa do espaço

PonteirosPonteiros

 Listas estáticas e dinâmicas

 Em uma lista dinâmica, não temos esse tipo de

problema.

 Arranjamos espaço conforme precisamos, ou conforme compramos um livro.

 O problema maior é: como encontrar o livro, já que

não temos estante?

 Para isso, utilizamos o ponteiro, que indica a posição (endereço) do próximo item da lista. É como se ao final de cada livro a última página indicasse o lugar (ou endereço) do próximo livro.

 Se mantivermos esse padrão, poderemos encontrar qualquer livro que queiramos seguindo a “corrente” estabelecida.

 Este mecanismo pode funcionar muito bem, mas para que não tenhamos problemas, precisamos ser bastante metódicos. Por exemplo, se retirarmos um livro e não o colocarmos no local inicial, quebraremos a corrente e não poderemos mais encontrar nenhum outro livro na seqüência.

 Inserção de um item na lista

 Em uma lista, podemos inserir itens em qualquer posição.

 Estática

 a inserção em uma lista estática implica o deslocamento de todos os outros itens da lista.

 Caso o item inserido esteja na última posição, não haverá problemas.

 Caso seja o primeiro elemento, toda a lista precisará ser deslocada, o que representa alto custo

PonteirosPonteiros

 Dinâmica

 a inserção em uma lista dinâmica consiste apenas no

rearranjo dos ponteiros envolvidos. Porém, o

principal custo é a busca pela posição onde o novo

elemento será inserido.

PonteirosPonteiros

 Busca de um elemento na lista

 A busca será feita pela chave do registro (no caso o ISBN do livro)

 Estática

 Nesta implementação, o módulo retornará a posição do item. Caso o item não exista na lista, será retornado o valor -1.

 Dinâmica

 Nesta implementação o ponteiro para o item será retornado. Caso o item não exista, será retornado o valor nulo.

PonteirosPonteiros

 Remoção de um elemento da lista

 A remoção consiste na eliminação do registro em questão. Encontraremos o registro a ser removido pelo ISBN.

 Estática

 É necessário o movimento inverso ao da inserção.

 Deve ser feito o deslocamento dos elementos para preencher o espaço agora vago na lista, que tem um custo computacional similar ao da inserção.

 Também é necessário atualizar qual o última posição da lista

PonteirosPonteiros