





Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
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
1 / 9
Esta página não é visível na pré-visualização
Não perca as partes importantes!






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.
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.
Já com os ponteiros, acessamos o próprio endereço da memória, e não seu conteúdo.
*
Exemplos: *p1: real; *p2: inteiro; *p3: caractere;
Ordena(ref v1, ref v2, tp);
booleano Ordena(ref valor1: real, ref valor2: Real, opção: inteiro)
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);
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 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
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.
Exemplo: uma lista de livros
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
Arranjamos espaço conforme precisamos, ou conforme compramos um livro.
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.
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
A busca será feita pela chave do registro (no caso o ISBN do livro)
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.
A remoção consiste na eliminação do registro em questão. Encontraremos o registro a ser removido pelo ISBN.
É 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