Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Ponteiros e alocação dinâmica de memória Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto 2 Ponteiros • Um ponteiro é o endereço de uma variável na memória. • Ou seja, ponteiros guardam endereços de memória. • Uma variável de ponteiro é uma variável especialmente declarada para guardar um ponteiro para seu tipo especificado. • O C é altamente dependente dos ponteiros. • É uma maneira rápida de referenciar uma variável em C; • Provêem suporte às listas encadeadas e outras estruturas de dados dinâmicas. 3 Ponteiros Analogia: • Quando você anota o endereço de um colega você está criando um ponteiro. • O ponteiro é este seu pedaço de papel, e ele tem anotado um endereço. • Você anota o endereço e depois você vai usar este endereço para achá-lo. • No C você anota o endereço de algo numa variável ponteiro para depois usar. 4 Ponteiros :: Operadores • Operadores para Ponteiros • operador &: • Devolve o endereço da memória em que se encontra alocado seu operando; • Exemplo: • m = &count; • atribui a m o endereço da memória em que se encontra a variável count. Esse endereço não tem nenhuma relação com o valor de count. 5 Ponteiros :: Operadores • operador &: • Exemplo mais concreto, em termos de memória: (m = &count; ) • assuma que a variável count foi alocada para a posição de memória 2000. • Assuma também que count tem como valor 100. • Então, após a sentença de atribuição anterior, m tem o valor 2000. 6 Ponteiros :: Operadores • operador *: • Devolve o valor da variável localizada no endereço que o segue; • Este operador sempre interpreta seu operando como um endereço de memória! • Exemplo: • seguindo o exemplo anterior, se m contem o endereço da variável count, q =*m; • coloca o valor de count em q. • Agora q tem o valor 100 porque 100 está armazenado na posição 2000, endereço da memória em que está armazenado m. 7 Ponteiros :: Declaração • Declarando Ponteiros • Os ponteiros devem ser declaradas colocando-se * em frente ao nome da variável para indicar ao compilador que ela guardará um ponteiro para aquele tipo de variável. • Exemplo: para declarar uma variável ponteiro ch para char, escreve- se: • char *ch; • Aqui, ch não é um caractere, mas um ponteiro para caractere Há uma grande diferença! • int *num, *temp; 8 Ponteiros :: Declaração • Pode-se misturar diretivas de ponteiro e de não-ponteiro na mesma declaração, como por exemplo: • int x, *y, count; • Declara x e count como sendo do tipo inteiro e y como sendo um ponteiro para o tipo inteiro. • O que faz o programa abaixo? 9 Ponteiros :: Atribuições • Atribuições de Ponteiros • O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado! • Isto é de suma importância! • Para atribuir um valor a um ponteiro recém-criado poderíamos igualá-lo a um valor de memória. 10 Ponteiros :: Mais exemplos 11 Ponteiros :: Aritimética • Existem apenas duas operações aritméticas que podem ser feitas com ponteiros: • Adição • Subtração • Regras da aritmética de ponteiros: • Cada vez que um ponteiro é incrementado, ele aponta para a posição de memória do próximo elemento do seu tipo base. • Cada vez que um ponteiro é decrementado, ele aponta para a posição de memória do elemento anterior do seu tipo base 12 Ponteiros :: Aritimética • Exemplo: • assuma que estamos usando uma máquina na qual um inteiro ocupa 2 bytes. Então … int *p, vet[4]={10,20,30,40}; p=&vet; printf("%d ",*p); p=p+1; printf("%d ",*p); • Quais valores serão impressos? • Aritmética de Ponteiros • Também é possível somar ponteiros: • p1 = p2 + 100; 13 Ponteiros :: Comparação • Comparação entre Ponteiros • É possível comparar dois ponteiros em uma expressão relacional. • Exemplo: if(p<q) printf(“p aponta para um endereço de memoria mais baixo que q\n”); • Geralmente, comparações de ponteiros são utilizadas para verificar se dois ou mais ponteiros apontam para um mesmo objeto (uso em estruturas de dados tais como pilhas, filas etc). 14 Ponteiros :: Exercícios • Explique a diferença entre: p++; (*p)++; *(p++); Analise estas duas linhas. vet[11]; p=vet[0]; • Podemos dizer que *(p+10) é a mesma coisa que vet[10] ? 15 Ponteiros e Vetores • Há uma estreita relação entre ponteiros e vetores. • De fato, os índices de um vetor são uma maneira mais confortável para se acessar um dado elemento. • char nome[80], *p1, ch; • p1 = nome; • p1 foi inicializado com o endereço do primeiro elemento da matriz nome: • ch = nome[4]; ou • ch=*(p1+4); copiam o quinto elemento de nome para ch 16 Ponteiros e Vetores • O nome de um vetor é um ponteiro constante. • Sabemos também que podemos indexar o nome de um vetor. • Como consequência podemos também indexar um ponteiro qualquer. • O programa mostrado a seguir funciona perfeitamente: 17 Ponteiros e Funções • Em C, usando o método tradicional de chamar uma função, a mesma só pode retornar apenas um valor. • Uma maneira de “retornar” dois ou mais valores, seria com o uso de ponteiros. 18 Ponteiros e Funções • Os argumentos podem ser passados para uma função de duas maneiras: • Chamada por Valor; • Chamada por referência. 19 Passando dados para função • Chamada por Valor: • O parâmetro formal da função recebe uma cópia do valor do argumento. • Conseqüência: • As alterações feitas nos parâmetros da função não têm nenhum efeito nas variáveis usadas para chamá-la. 20 Passando dados para função • Chamada por Referência: • O parâmetro formal da função recebe uma cópia do endereço do argumento (ponteiro). • Conseqüências: • Dentro da função, o endereço é utilizado para acessar o argumento real usado na chamada. • Alterações feitas no parâmetro afetam a variáveis usada para chamar a função. 21 Passando dados para função • Chamadas: Valor X Referência: • Exemplo 1 Note que o valor da variável t, usada como argumento na chamada de sqr, permanece inalterado, de modo que a saída deste programa será 100,10. 22 Passando dados para função • Chamadas: Valor X Referência: • Exemplo 2 Para a chamada por referência, deve-se passar para a função um ponteiro para cada argumento que se deseja modificar. 23 Ponteiros :: Indireção Multipla • Ocorre quando se tem um ponteiro que aponta para outro ponteiro que (finalmente) aponta para o valor. • Indireção simples (vista até agora) • Indireção múltipla 24 Ponteiros :: Indireção Multipla • Exemplo: 25 Ponteiros :: Indireção Multipla • Exemplo: 26 Ponteiros :: Exercícios • Este programa possui 2 erros. Corrija-os: 27 Ponteiros :: Exercícios • O programa abaixo usa aritmética de ponteiros para acessar os elementos de um vetor. Mostre o que será impresso.:
Compartilhar