Buscar

Aula 6 - PONTEIROS

Prévia do material em texto

PROGRAMAÇÃO II 
AULA 6 – PONTEIROS 
 
 
 
 
 
 
CIÊNCIA DA COMPUTAÇÃO 
 
INTRODUÇÃO 
Ponteiros são um dos recursos mais 
poderosos da linguagem C e de outras; 
 
A tentativa de evitá-los implicará quase 
sempre códigos maiores e de execução 
mais lenta. 
 
Para quem está começando, pode parecer 
(e algumas vezes é) um tanto difícil. Mas 
não há outro caminho senão enfrentar a 
realidade. 
2 
INTRODUÇÃO 
São muitas as aplicações de ponteiros. A 
seguir, relação das mais comuns. 
 Alocação de estruturas dinâmicas de 
dados; 
 Manipulação de arrays e strings; 
 Passagem de parâmetros por referência; 
 Retornar mais de um valor para uma 
função. 
 3 
COMO FUNCIONAM OS PONTEIROS 
Ints guardam inteiros, floats guardam 
números de ponto flutuante, Ponteiros 
guardam endereços de memória; 
Quando você anota o endereço de um 
colega você está criando um ponteiro. 
 
 
 
O C funciona assim, você anota o endereço 
de algo numa variável ponteiro para 
depois usar. 
4 
COMO FUNCIONAM OS PONTEIROS 
No C quando declaramos ponteiros nós 
informamos ao compilador para que 
tipo de variável vamos apontá-lo; 
 
 
 
 
5 
DECLARANDO E UTILIZANDO PONTEIROS 
Para declarar um ponteiro temos a 
seguinte forma geral: 
 
 (*) que faz o compilador saber que aquela 
variável não vai guardar um valor mas 
sim um endereço; 
 
 
É necessário inicializar os ponteiros, 
assim como toda variável declarada em C; 
 Apontam para um lugar indefinido; 
 
6 
DECLARANDO E UTILIZANDO PONTEIROS 
O ponteiro deve ser inicializado (apontando para 
algum lugar conhecido) antes de ser usado! 
 
Para atribuir um valor a um ponteiro recém-
criado poderíamos igualá-lo a um valor de 
memória. 
 
Para saber o endereço de uma variável basta 
usar o operador: 
 & 7 
DECLARANDO E UTILIZANDO PONTEIROS 
Após inicializar o ponteiro, você esta 
“liberado” para utilizá-lo; 
 
Podemos, por exemplo, alterar o valor de 
count usando pt; 
 Para tanto vamos usar o operador 
“inverso” do operador &, o operador *; 
 *pt é equivalente ao próprio count; 
 *pt = 12; 
 
 
8 
PROJETO 1: 
9 
DECLARANDO E UTILIZANDO PONTEIROS 
& = é equivalente a ligar para fábrica e pegar o endereço; 
* = faz uma visita à empresa aplicando o operador ao papel 
 10 
 variável 
 
ponteiro 
 
PROJETO 2 
11 
DECLARANDO E UTILIZANDO PONTEIROS 
Podemos fazer algumas operações aritméticas 
com ponteiros; 
 p1 = p2; 
 *p1 = *p2; 
 
 Incremento e decremento de ponteiros 
 Quando incrementamos um ponteiro ele passa 
a apontar para o próximo valor do mesmo tipo 
o qual o ponteiro aponta; 
 Se você incrementa um ponteiro char* ele 
anda 1 byte, já um ponteiro double* ele anda 
8 bytes na memória. 
 
12 
DECLARANDO E UTILIZANDO PONTEIROS 
 
 
O exemplo acima é uma operação com ponteiro (p 
um tipo *p). Mas podemos também incrementar o 
conteúdo de um ponteiro; 
 
 
Outras operações aritméticas úteis são a soma 
e subtração de inteiros com ponteiros 
13 
DECLARANDO E UTILIZANDO PONTEIROS 
E se você quiser usar o conteúdo do ponteiro, 15 
posições adiante: 
 
Comparação entre dois ponteiros: == !=  p ou 
*p; 
 >= <= qual dos dois ponteiros está mais adiante na 
memória 
 
Operações que você não pode efetuar com 
ponteiros: dividir ou multiplicar, adicionar ou 
subtrair floats ou doubles; 
 
 
14 
DECLARANDO E UTILIZANDO PONTEIROS 
 É uma boa prática incluir as letras ptr 
em nomes de variáveis de ponteiros para 
tornar claro que essas variáveis são 
ponteiros e precisam ser manipuladas 
corretamente; 
 int y = 5; 
int *yptr; 
 
Basicamente, depois que se aprende a 
usar os dois operadores (& e *) fica fácil 
entender operações com ponteiros 
15 
EXERCÍCIOS 
 Explique a diferença entre: 
 p++; (*p)++; *(p++) 
 
 O que quer dizer *(p+10)? 
 
 Sendo declarado: 
int a=2; b =2; 
int *p1 *p2; 
p1 = &a; 
p2 = & b; 
Qual a diferença entre p1 == p2 e *p1 == *p2? 
16 
EXERCÍCIOS 
Qual o valor de y no 
final do programa? 
Escreva um 
comentário em cada 
comando de 
atribuição 
explicando o que ele 
faz e o valor da 
variável à esquerda 
do ‘=‘ após sua 
execução 
17 
EXERCÍCIOS 
Para cada uma das sentenças 
seguintes, escreva uma instrução 
que realize a tarefa indicada. 
Admita que as variáveis de ponto 
flutuante numero1 e numero2 
foram declaradas e que numero1 
foi inicializada com o valor 7.3. 
18 
EXERCÍCIOS 
 Declare a variável fptr como ponteiro para um 
objeto do tipo float; 
 Atribua o endereço da variável numero1 à variável 
de ponteiro fptr; 
 Imprima o valor do objeto apontado por fptr; 
 Atribua o valor do objeto apontado por fptr à 
variável número2; 
 Imprima o valor de numero2; 
 Imprima o endereço de numero1. Use o 
especificador de conversão %p; 
 Imprima o endereço de armazenamento em fptr. 
Use o especificador de conversão %p. O valor 
impresso é igual ao endereço de numero1; 
 
19 
 
VETORES COMO PONTEIROS 
Ponteiros e vetores têm uma ligação muito 
forte; 
 
Quando você declara uma matriz da 
seguinte forma: 
 
 
O compilador em C calcula o tamanho, em 
bytes, necessário para armazenar a matriz 20 
 
VETORES COMO PONTEIROS 
O compilador então aloca este número de 
bytes em um espaço livre de memória; 
 
O nome da variável que você declarou é na 
verdade um ponteiro para o tipo da matriz; 
 Este ponteiro aponta para o primeiro elemento da 
matriz; 
 
Mas, como podemos usar a seguinte 
notação? 21 
 
VETORES COMO PONTEIROS 
A notação anterior é absolutamente 
equivalente a se fazer: 
 
 
Fica claro, por exemplo, porque é que, no 
C, a indexação começa em 0; 
 É porque, ao pegarmos o valor do primeiro elemento 
de um vetor, queremos de fato, *nome_da_variavel e 
então devemos ter um índice 0; 
22 
VETORES COMO PONTEIROS 
PROJETO 3 
23 
VETORES COMO PONTEIROS 
 No projeto anterior, cada vez que se faz 
matrx[i][j] o programa tem que calcular o 
deslocamento para dar ao ponteiro; 
 
No segundo programa o único cálculo que deve 
ser feito é o de um incremento de ponteiro; 
 
Fazer 2500 incrementos em um ponteiro é muito 
mais rápido que calcular 2500 deslocamentos 
completos; 24 
EXERCÍCIO 1 
Escreva um programa que declare uma 
matriz 100 x 100 de inteiros. Você deve 
inicializar a matriz com zeros usando 
ponteiros para endereçar seus 
elementos. Preencha depois a matriz 
com os números de 10000 a 1, também 
usando ponteiros; 
25 
VETORES COMO PONTEIROS 
Há uma diferença entre o nome de 
um vetor e um ponteiro que deve 
ser frisada: 
 Um ponteiro é uma variável, mas o 
nome de um vetor não é uma 
variável; 
 
 Isto significa, que não se consegue 
alterar o endereço que é apontado 
pelo nome do vetor 
 
26 
VETORES COMO PONTEIROS 
27 
PONTEIROS COMO VETORES 
Sabemos que: 
 O nome de um vetor é um ponteiro 
constante; 
 
 Podemos indexar o nome de um 
vetor; 
 
Sendo assim, podemos indexar 
um ponteiro qualquer 
 
28 
PONTEIROS COMO VETORES 
 
 
 
 
 
 
 
 
Podemos ver que p[2] equivale a 
*(p+2) 29 
STRINGS 
PROJETO 4 
Seguindo o raciocínio, nomes de 
strings, são do tipo char*; 
30 
STRINGS 
Aspectos observados no projeto anterior: 
 Podemos passar ponteiro como argumentos de 
funções. Passando o ponteiro você possibilita à função 
alterar o conteúdo da string; 
 
 No comando while(*origem) estamos usando o fato 
de que a string termina em ‘\0’; 
 
 Origem++ e destino++ não estamos alterando o valor 
do ponteiro base da string. No C são passados para as 
funções cópias dos argumentos; 
 
 Quando alteramos o ponteiro origem o pontei- 
ro str2 permanece inalterado na função main; 
 
 
31 
EXERCÍCIO 2 
Faça uma função StrLen e 
Strcat() que funcionem como 
as funções strlen e strcat da 
biblioteca string.h 
respectivamente;32 
ENDEREÇOS DE ELEMENTOS DE VETORES 
A notação abaixo é válida: 
 
E retorna o endereço do ponto do vetor 
indexado por índice. 
 Isto seria equivalente a 
nome_da_variável +índice; 
 
 nome_da_variável tem o endereço de 
&nome_da_variável[0]; 
 
33 
VETORES DE PONTEIROS 
Podemos construir vetores de 
ponteiros; 
 
Uma declaração de um vetor de 
ponteiros inteiros poderia ser: 
 
 
No caso acima, pmatrx é um vetor que 
armazena 10 ponteiros para inteiros 
34 
PONTEIROS DE PONTEIROS 
Podemos declarar um ponteiro para 
um ponteiro com a seguinte notação: 
 
 
Algumas considerações: 
 **nome_da_variável é o conteúdo final da 
variável apontada; 
 *nome_da_variável é o conteúdo do 
ponteiro intermediário; 
Podemos fazer ****nome_da_variável ; 
35 
PROJETO 5 
36 
EXERCÍCIO 
Encontre o erro no programa abaixo e 
corrija-o para que escreva o número 10 
na tela, através de q; 
37 
CUIDADOS A SEREM TOMADOS AO SE 
USAR PONTEIROS 
 
SAIBA SEMPRE PARA ONDE O 
PONTEIRO ESTÁ APONTANDO; 
 
NUNCA USE UM PONTEIRO QUE 
NÃO FOI INICIALIZADO 
38 
EXERCÍCIO 3 
Escrever um programa para imprimir as 
matrizes declaradas abaixo utilizando 
ponteiros 
39

Continue navegando