Buscar

Aula 10 0 - Teoria - Ponteiros

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.:

Continue navegando