Buscar

Aula 7 - Ponteiros

Prévia do material em texto

Programação Estruturada II
Aula 7 – Ponteiros
Prof: Efrem Lousada
efrem.lousada@anhanguera.com
plainit.co/u/efrem
Sumário
Prof: Efrem Lousada 2
1. Revisão Funções e Estruturas
2. Definição Ponteiros
2. Como funcionam
3. Declarando
4. Utilizando
5. Incremento e Decremento
6. Relação com Vetores
Ponteiros
Prof: Efrem Lousada 3
• Ponteiros é um dos tópicos mais difíceis da 
linguagem C.
• A linguagem C é altamente dependente dos 
ponteiros. Para ser um bom programador em C é 
fundamental que se tenha um bom domínio deles.
• Ponteiros são tão importantes na linguagem C que 
você já os viu e nem percebeu, pois mesmo para se 
fazer um introdução básica à linguagem C precisa-se 
deles.
Ponteiros
Prof: Efrem Lousada 4
Definição
• Na linguagem C, cada vez que é declarada uma 
variável (por exemplo, char ch1) é associado a esta 
variável um número hexadecimal (ex: 0022FF77) que 
é denominado de endereço. 
• Esse número realiza a associação entre o nome 
da variável com o espaço físico que ela ocupa na 
memória do computador. 
Ponteiros
Prof: Efrem Lousada 5
Como Funcionam
• Da mesma forma que declaramos variáveis para 
armazenar inteiros, podemos declarar variáveis que, 
em vez de servirem para armazenar valores inteiros, 
servem para armazenar endereços de memória onde 
há variáveis inteiras armazenadas. 
Ponteiros são variáveis que guardam endereços de 
memória.
Ponteiros
Prof: Efrem Lousada 6
Como Funcionam
• Um ponteiro nada mais é que uma variável capaz 
de armazenar um número hexadecimal que 
corresponde a um endereço de memória de outra 
variável. 
Para atribuir e acessar endereços de memória, a 
linguagem utiliza dois operadores : 
& e *
Ponteiros
Prof: Efrem Lousada 7
Como Funcionam
• O operador unário & (“endereço de”), aplicado a 
variáveis, resulta no endereço da posição da 
memória reservada para a variável. 
• O operador unário * (“conteúdo de”), aplicado a 
variáveis do tipo ponteiro, acessa o conteúdo do 
endereço de memória armazenado pela variável 
ponteiro. 
Ponteiros
Prof: Efrem Lousada 8
Declarando
• Para declarar um ponteiro temos a seguinte 
forma geral: 
tipo_do_ponteiro *nome_da_variável; 
int *pt; 
char *temp,*pt2;
Ponteiros - Utilizando 
Prof: Efrem Lousada 9
• Suponha por exemplo que a variável val, 
armazene dentro dela um valor inteiro. 
• Quando ela é declarada (int val;), o compilador 
reservará automaticamente um espaço na memória 
(caixinha) para ela. 
valor de val
val
0022ff64 endereço de val
Ponteiros - Utilizando 
Prof: Efrem Lousada 10
• Considere:
int val=10; 
int *pt1, *pt2=NULL; 
10
0022ff64 endereço de val
val
Ponteiros - Utilizando 
Prof: Efrem Lousada 11
• Considere:
int val=10; 
int *pt1, *pt2=NULL; 
pt1=&val; // pt1 passa a apontar para val
10
0022ff64 endereço de val
pt1
val
Ponteiros - Utilizando 
Prof: Efrem Lousada 12
• Considere:
int val=10; 
int *pt1, *pt2=NULL; 
pt1=&val; // pt1 passa a apontar para val
*pt1=123; // altera o conteúdo de val
123
0022ff64 endereço de val
pt1
val
Ponteiros
Prof: Efrem Lousada 13
Atribuição
• Se p1 e p2 são ponteiros, então a atribuição 
p1 = p2; 
faz p1 apontar para o mesmo endereço apontado 
por p2
• Para fazer a região apontada por p1 ter o mesmo 
valor da região apontada por p2 devemos fazer 
*p1 = *p2;
Ponteiros
Prof: Efrem Lousada 14
Incremento e Decremento
• Quando incrementamos um ponteiro estamos 
fazendo ele apontar para o próximo elemento do vetor 
– Se p é um ponteiro para inteiro (int *p;), e p armazena o endereço 
100, então p++ faz p armazenar o endereço 104 (pois um inteiro 
ocupa 4 bytes)
– A mesma regra vale para decremento 
• Para incrementar o conteúdo da região apontada 
por p fazemos (*p)++;
Ponteiros
Prof: Efrem Lousada 15
Soma/subtração de ponteiros com inteiros
• Para fazer um ponteiro p apontar para N elementos 
a frente fazemos p += N; ou p = p+N; 
• Para acessar o conteúdo de N elementos a frente 
usamos *(p+N) 
• A subtração funciona de forma similar
Ponteiros
Prof: Efrem Lousada 16
Relação com vetores
• Ponteiros e vetores têm uma ligação muito forte.
• Vimos que um vetor é declarado da seguinte forma:
tipo_da_variável nome_da_variável [tam]; 
• Quando isto é feito, o compilador C, calcula o 
tamanho, em bytes, necessário para armazenar o vetor. 
Este tamanho é: tam x tamanho_do_tipo
Ponteiros - Relação com vetores
Prof: Efrem Lousada 17
• A seguir, o compilador aloca o número de bytes que 
ele calculou, em um espaço livre de memória.
• O nome do vetor declarado é na verdade um 
ponteiro para o tipo de variável do vetor. 
• Este conceito é fundamental porque, uma vez que 
foi alocado na memória o espaço para o vetor, o 
compilador pega o nome da variável (que é um 
ponteiro) e aponta para o primeiro elemento do vetor.
Ponteiros
Prof: Efrem Lousada 18
Relação com vetores
Ex.:
main() { 
int v[] = {10, 20, 30}; 
printf("%p\n", v); 
printf("%p\n", v+2); 
printf("%d\n", *(v+2)); 
}
Ponteiros
Prof: Efrem Lousada 19
Exercícios
1) Resolver os exercícios do Livro Texto
Exercícios de autorrevisão - 7.3 e 7.4 
Páginas 243 e 244 
Obs: No livro já tem as respostas, tente fazer e depois verifique se esta 
correto
Ponteiros
Prof: Efrem Lousada 20
Exercícios
2) Fazer um programa para:
declarar variáveis a, b, c, d do tipo int.
declarar variáveis e, f, g, h do tipo float.
declarar vetor v de 10 elementos do tipo char.
declarar variável x do tipo int.
criar um ponteiro apontando para o endereço de a.
incrementar o ponteiro, mostrando o conteúdo do endereço apontado (em 
forma de número) e seu endereço. 
Ponteiros
Prof: Efrem Lousada 21
Exercícios
3) Fazer uma função para:
Receber dois ponteiros para char (char*) como parâmetro e um número 
representando uma certa quantidade de caracteres.
Procurar, no vetor apontado pelo parâmetro 1, o primeiro caractere de 
espaço (‘ ‘) ou o fim de vetor (representado pela quantidade fornecida no 
parâmetro 3).
Copiar os caracteres anteriores ao espaço no vetor indicado pelo segundo 
parâmetro.
Retornar o número de caracteres copiados.
Fim,
Obrigado!
Prof: Efrem Lousada 22

Continue navegando