Vous êtes sur la page 1sur 29

1

Programao Estruturada
II
Prof. Eder Barboza
ederbarbozati@gmail.com

Ponteiros
Definio
Variveis Ponteiros
Aritmtica de Ponteiros
Operadores
Comparaao
Matrizes

Motivao - Ponteiros
Ponteiros:

Fornecem os meios pelos quais as funes


podem modificar seus argumentos.

So usados para suportar as rotinas de alocao


dinmica de C.

Aumenta a eficincia de algumas rotinas.

Definio - Ponteiros
Ponteiro:
uma varivel que contm um endereo de memria.

Esse endereo normalmente a posio de uma


outra varivel de memria. Se uma varivel contm o
endereo de uma outra, ento a primeira varivel
dita para apontar para a segunda.

Ponteiros
Ponteiro

Varivel

Endere
o

Valor

count
Indireo Simples

Variveis Ponteiros
Varivel Ponteiro:
Uma declarao de ponteiro consiste no tipo base,
um * e o nome da varivel.

A forma geral para declarar uma varivel ponteiro

tipo *nome;
Onde tipo qualquer tipo vlido em C e nome o
nome da varivel ponteiro.
7

Prtica - Ponteiros

Aula 4 - Manipulando Variveis Ponteiros.cpp

Expresso com Ponteiros


Aritmtica de Ponteiros:
Existem cinco operaes bsicas que podem
ser usadas com ponteiros

Atribuio.

Trazer o endereo do ponteiro.

Encontra valores.

Incrementar o ponteiro.

Adio e Subtrao.

Expresso com Ponteiros


Atribuio de Ponteiros:
Como em qualquer varivel, um ponteiro pode
ser usado no lado direito de um comando de
atribuio para passar seu valor para um outro
ponteiro.
Exemplo:

Aula 4 - AtribuiodePonteiros.cpp

10

Os operadores de Ponteiros
Operador &:
Operador unrio que devolve o endereo da
memria do seu operando.

Operador *:
Operador unrio que devolve o valor da
varivel localizada no endereo que o segue
( endereo da varivel que foi atribuida ao ponteiro ).

11

Os operadores de Ponteiros
Adio e Subtrao
Podem ser usadas duas operaes aritmticas
com ponteiros: Adio e Subtrao.
Exemplo:
Se p1 um ponteiro do tipo integer com o valor
atual de 2000, aps a operao p1++, o ponteiro
passar a ter o valor de 2002.
Cada vez que ele for incrementado ele ir
apontar para o prximo inteiro cada inteiro utiliza-se
de 2 byte de memria.
12

Os operadores de Ponteiros
Adio e Subtrao
O mesmo verdade para decremento, aps a
expresso p1--, o ponteiro ir receber o valor de 1998.
Resumindo, cada vez que o ponteiro
incrementado ele aponta a prxima posio de
memria do seu tipo base, o mesmo vale para
decremento.
No existe uma limitao somente para
incremento e decremento, pode-se somar ou subtrair
inteiros de ponteiros.
p1 = p1 + 12; o ponteiro p1 aponta para o
dcimo segundo elemento do tipo p1 adiante.

13

Os operadores de Ponteiros
Cada varivel do tipo char utilizase de um byte, logo:
Para cada incremento da varivel
ch, incremeta-se o endereo em 1
byte ( 3000, 3001, 3002, etc ).

Cada varivel do tipo integer


utiliza-se de dois bytes, logo:

Para cada incremento da varivel


i, incrementa-se o endereo em 2
bytes( 3000, 3002, 3004, etc ).

14

Prtica Operaes com


ponteiros
Aula 4 - Operao com Ponteiros.cpp
Aula 4 - Operacao com ponteiros_string.cpp

15

Comparao de Ponteiros
Comparao:
Teste relacionais com >=, <=, > e < so aceitos
entre ponteiros somente quando os dois operandos
so ponteiros.
Outro ponto importante quanto ao tipo
apontado pelos operandos. As duas variveis devem
ser do mesmo tipo.
Variveis ponteiros ainda podem ser testadas
quanto igualdade ( == ) ou desigualdade ( !=).

16

Comparao de Ponteiros
Comparao:
Um exemplo de comparao de dois ponteiros:

Aula 4 - Comparando Ponteiros.c

A comparao normalmente utilizada quando


dois ou mais ponteiros apontam para o mesmo objeto
em comum, por exemplo em uma pilha.

17

Ponteiros - Cuidados
As variveis ponteiros devem sempre apontar para
o tipo de dado correto.
Por exemplo:
No atribua a uma varivel ponteiro de um tipo
inteiro o endereo de uma varivel do tipo float.
O programa ir compilar sem nenhuma
mensagem de erro. Alguns compiladores iro produzir
uma mensagem de erro.
No se pode multiplica ou dividir ponteiros.

18

Matrizes Vetores e Ponteiros


Existe um estreita relao entre ponteiros e matrizes.
O nome de uma matriz um endereo, ou seja, um
ponteiro.
A maneira como ambos acessam a memria
identico.

O programa abaixo demonstra isso:

Aula 4 - Lendo uma matriz.c


19

Matrizes Vetores e Ponteiros


Matrizes:
No caso do cdigo abaixo:
char str[50], *p1;
p1 = str;
Ocorreu a inializao do ponteiro p1, com o
primeiro endereo da matriz.
Logo posso afirmar:
*p1 = str[0], *(p1+1) = str[1], *(p1+2) = str[2]
p1 = &str[0], (p1+1) = &str[1], (p1+2)=&str[2]
20

Prtica Vetores como


Ponteiros

Aula 4 - Vetores com Ponteiros.cpp

21

Matrizes Vetores e Ponteiros


Logo, conforme visto no exemplo anterior eu posso
usar aritmtica de ponteiros para manipular um vetor,
como por exemplo no exercicio abaixo:

Aula 4 - Vetores com ponteiros_2.cpp

22

Exerccios
1 Utilizando ponteiros
Criar um algoritmo que leia nmeros inteiros
e os armazene em vetor de 9 elementos.
O aplicativo ir imprimir todos os elementos
da matriz multiplicado por uma constante
( nmero inteiro ).
Importante: Todos os laos de repetio
devem ser trabalhados utilizando ponteiros.

23

Exercicio
1 Continuao:
Deve ser criada uma funo para
entrar com os nmeros na matriz e
outra para escrever esses nmeros
na matriz.
No poder ser utilizado variveis
globais.
A entrada pode ser feita direto no
aplicativo, no precisa pedir para o
24

Exerccios
2 - Qual a saida desse programa
int vet[]={5,6,8}, *p;
p = vet;
printf("%p %p %d
p,*p+2,*(p+1));
system("PAUSE");

%d

\n",&vet,

25

Exerccios
3 Encontre os erros nesses dois
programas e comente o que estava
errado, o que isso poderia causar e
como deve ser resolvido.
void main() /* esse programa esta errado */
{
int x, *p;
x = 10;
*p = x;
}

26

Exerccios
4 Encontre os erros nesses dois
programas e comente o que estava
errado, o que isso poderia causar e
como deve ser resolvido.
void main() /* esse programa esta errado */
{
int x, *p;
x = 10;
p = x;
printf ("%d", *p);

27

Exerccios No fazer
5 - Faa um programa que leia um conjunto de
valores digitados pelo usurio, armazene os
valores positivos em uma pilha.
Os valores negativos devero ser ignorados.
-> Se o usurio digitar -2 o aplicativo ir finalizar.
-> obrigatrio:
A utilizao de
funes[ pop(),push(),verificanumeronegativo()]
A utilizao de ponteiros.
A utilizao de aritmtica de ponteiros.
No necessrio criar um projeto.
Todo aplicativo pode estar em somente um
28
arquivo.c

Sugesto de leitura para


fixao do contedo da aula de
hoje:
Bibliogrfia Bsica:
Livro Texto: Treinamento em Linguagem C.
Bibliogrfica Complementar:
Livro r: SCHILDT, H. C Completo e Total.,
So Paulo: Makron Books, 1997.

29

Vous aimerez peut-être aussi