220 likes | 305 Views
Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1. Ponteiros. Variáveis. Podem ser divididas em: Variáveis estáticas Variáveis dinâmicas Podem ser criadas e destruídas durante a execução de um programa. Declaração -> Indireta
E N D
Programação IIProfessora: Mai-Lyvanessahorário: ter 9h-11h; sex 11h-13hAula 1
Variáveis • Podem ser divididas em: • Variáveis estáticas • Variáveis dinâmicas • Podem ser criadas e destruídas durante a execução de um programa. • Declaração -> Indireta • Vinculação -> Por meio de ponteiros • Vantagens
Áreas de Memória Mapa de memória de um computador padrão IBM-PC
O tipo pointer • Sua posição de memória armazena um endereço de outra posição de memória, que por sua vez pode conter um dado. Não armazena um dado. • Notação utiliza ^ • Exemplos: • Var • P_nome : ^string; • P_idade : ^integer; • P_salario : ^real;
O tipo pointer • Exemplos: • write(‘Idade = ‘,P_idade^); • Sugestão: Padronização de nomes • Ponteiro vazio é preenchido com NIL • Operador @ • Ex: P_idade := @idade; • (Acessa o endereço da posição de memória referenciada)
Exemplo: • Criação de um ponteiro apontando para uma variável inteira. • Criação de um ponteiro apontando para uma variável real. • Exercicios: • Declare 2 variáveis inteiras e dois ponteiros para inteiros que devem ser associados ao endereço das variáveis. Usando somente os ponteiros faça com que as variáveis recebam o dobro e o triplo de seu valor respectivamente,
Alocação dinâmica de memória • Memória alocada conforme a necessidade • Evita DESPERDÍCIO DE MEMÓRIA X MEMÓRIA INSUFICIENTE • Quantidade de memória pode ser determinada em tempo de execução
Alocação dinâmica de memória • Procedimento new(ponteiro) • Aloca espaço de memória alta para armazenar uma variável alocada dinamicamente por vez.
Alocação dinâmica de memória • IMPORTANTE: Sempre que um espaço de memória for alocado dinamicamente, ele tem que ser liberado explicitamente. Ou seja a cada new, deve corresponder um dispose, pois o espaço de memória alocado explicitamente não será liberado automaticamente. • Procedimento dispose(ponteiro) • Libera o espaço de memória, endereçada pelo ponteiro, existente na área de memória (HEAP).
Algumas funções de gerenciamento de memória em Pascal • MemAvail • Exibe a quantidade total de memória livre no HEAP, ou seja a soma de todos os blocos de memória livres. • Procedimento MaxAvail • Retorna o tamanho do maior bloco contínuo de memória no HEAP. Este valor corresponde ao maior tamanho possível de variável dinâmica que pode ser alocado a qualquer tempo. • Obs: Estas funções estão disponíveis apenas no Turbo Pascal.
Alocação dinâmica de memória - exercícios - • Ex: • 1)Aloque dinamicamente duas variáveis do tipo inteiro. Leia dois valores nestas variáveis. Verifica se o valor de A é maior que B. Em caso afirmativo exiba o quociente de A dividido por B. • 2) Leia 5 valores e apresente o total da soma dos mesmos. Crie dinamicamente a variável que irá receber os valores. Exiba a quantidade de memória antes e depois da alocação de memória para a variável e depois da liberação da mesma.
Alocação dinâmica de memória • GetMem • Também é usado para alocar dinamicamente espaço de memória para uma variável. Gerencia melhor o espaço de memória. A variável criada pode ter o número de bytes especificado pelo programador. • Sintaxe • GetMem(ponteiro,numero_de_bytes); • Ex: GetMem(P_nome, 30); GetMem(P_total, 20); • Como saber quantos bytes reservar? • Sizeof(tipo)
Algumas funções de gerenciamento de memória em Pascal • Função útil na alocação de blocos de memória: • SizeOf • Retorna o número de bytes ocupados por um argumento (funciona tanto no Pascal como no Delphi).
Alocação dinâmica de memória • FreeMem => Destrói uma variável criada dinamicamente, liberando seu espaço de memória. Deve ser usada em conjunto com GetMem. Ex: FreeMem(P_nome, 30); FreeMem(P_total, 20); Obs: Especificar exatamente a mesma quantidade de bytes que foi alocada.
Alocação dinâmica de memória • Alocação dinâmica de memória na verdade tem uma grande utilidade para alocação de blocos de dados. Até agora vimos como fazer a alocação apenas de uma variável por vez. Veremos como trabalhar com vetores e matrizes alocados dinamicamente.
Alocação dinâmica de memória – Vetores e matrizes • Características • Satisfaz a necessidade de criarmos uma matriz com uma quantidade de elementos desconhecida em tempo de projeto. • Deve-se criar um tipo matriz. • Pode-se usar a constante MaxInt pré-definida. • Declara-se uma variável que seja do tipo ponteiro para o tipo matriz criado. • Faz-se alocação dinâmica de memória usando-se GetMem e SizeOf.
Alocação dinâmica de memória – Vetores e matrizes • Ex de criação do tipo e declaração do ponteiro: Type P_mat = ^vetor; vetor = array[1..MaxInt] of integer; matriz = array[1..181,1..181]; Var aponta : P_mat; aponta_mat : ^matriz;
Alocação dinâmica de memória – Vetores e matrizes • Ex. de alocação dinâmica da memória do vetor: getMem(aponta, N * SizeOf(integer)); • Onde N é a quantidade de elementos que se deseja no vetor • Ex. de utilização dos elementos do vetor: for x:= 1 to N do writeln(aponta^[x]);
Alocação dinâmica de memória – Vetores e matrizes • Ex. de alocação dinâmica da memória da matriz: getMem(aponta, L * C * SizeOf(integer)); • Onde L é a quantidade de linhas que se deseja na matriz e C é a quantidade de colunas. • Ex. de utilização dos elementos da matriz: for x:= 1 to L do for y := 1 to C do writeln(aponta_mat^[x,y]);
Alocação dinâmica de memória – Vetores e matrizes • Liberando a memória do vetor freeMem(aponta,N * SizeOf(integer)); • Liberando a memória da matriz freeMem(aponta_mat, L * C * SizeOf(integer));
Exercício • Leia um número inteiro N e aloque dinamicamente memória para um vetor de N inteiros. Leia os valores do vetor e exiba a média dos valores lidos.