You are on page 1of 44

Ponteiros

Prof. Raimundo Barreto


DCC/ICE/UFAM
Fundamentos
Fundamentos

 Um ponteiro uma varivel que representa


a localizao (em vez do valor) de um item
de dado
 Na memria do computador, todo item de
dado armazenado ocupa uma ou mais
clulas contguas de memria.
 Suponha que v seja uma varivel. O
endereo da localizao de v pode ser
determinado pela expresso &v.
Fundamentos
 & um operador unrio que avalia o
endereo do seu operando
 Podemos assinalar o endereo de v a outra
varivel pv, assim:
pv = &v;

endereo de v valor de v
pv v
Fundamentos

 Qual ser o valor de v?

main()
{
int u=3;
int v;
int *pu;

pu = &u;
v = *pu;

printf(v=%d\n, v);
}
Fundamentos

 u1 e u2 so equivalentes?
main()
{
int u1, u2;
int v=3;
int *pv;

u1 = 2 * (v + 5);
pv = &v;
u2 = 2 * (*pv + 5);

printf(u1=%d u2=%d\n, u1, u2);


}
Fundamentos

 O que aconteceria se fosse includa a


seguinte instruo *pv = 0?
Declarao de Ponteiros

 Forma geral:
tipo *var_ptr;
 Exemplos:
float *pv;
int *ptr;
char *str;
 Inicializao
#define NULL 0

float *pv = NULL;


Passando ponteiros
para uma funo
Passando ponteiros
para uma funo

 Ponteiros so usados para que itens de


dados sejam acessados e alterados por
funes e devolvidos alterados para a parte
chamadora.
 So chamados de passagem por referncia.
 Se a passagem for valor, o item de dado
copiado para a funo e no produz efeito
colateral na parte chamadora.
Passando ponteiros
para uma funo

 Mostra a diferena entre parmetros por


referncia e por valor.
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Passando ponteiros
para uma funo

 Analisar uma linha de texto e dizer a


quantidade de vogais, consoantes, dgitos,
brancos e outros smbolos. Definir uma
funo especfica para fazer tal anlise.
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Passando ponteiros
para uma funo

 Observao com relao a funo scanf


scanf (%[AEIOUaeiou]);
S aceita vogais maisculas e minsculas
scanf (%[^\n]);
Aceita qualquer smbolo exceto o nova linha
Exige que os argumentos que sejam variveis
comuns sejam precedidos por um ampersand (&).
Entretanto, nomes de matrizes so excees.
Passando ponteiros
para uma funo

main()
{
char item[20];
int num_peca;
float custo;
...
scanf(%s %d %f, item, &num_pea, &custo);
...
}

O nome da matriz j representa o endereo da matriz


Passando ponteiros
para uma funo

E se eu quiser ler um elemento particular da matriz?

scanf (%f, &lista[cont]);

Nesse caso, o nome do elemento da matriz tem


que aparecer precedido por um ampersand
Ponteiros e matrizes
unidimensionais
Ponteiros e matrizes
unidimensionais

 O nome de uma matriz , na verdade, um


ponteiro para o primeiro elemento da matriz.
O endereo do primeiro elemento da matriz pode
ser expresso por &x[0] ou simplesmente x.
O endereo do segundo elemento da matriz pode
ser expresso por &x[1] ou como (x+1).
O endereo do i-simo elemento da matriz pode
ser expresso por &x[i] ou como (x+i).
Ponteiros e matrizes
unidimensionais
 Quando dizemos (x+i)estamos especificando
uma localizao que i elementos alm do
primeiro.
 O programador no precisa se preocupar com o
nmero de clulas da memria associada com
cada tipo de elemento da matriz.
 Obviamente que x[i] e *(x+i) representam o
contedo desses endereos.
Ponteiros e matrizes
unidimensionais

 Ilustrao da relao entre elementos da


matriz e seus endereos.
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Ponteiros e matrizes
unidimensionais

 possvel definir matrizes como ponteiros ao


invs de matrizes convencionais.
 Sintaticamente as duas definies so
equivalentes.
 Entretanto, uma definio convencional de matriz
j reserva a memria suficiente. O que no
ocorre se for definida como ponteiro.
 Exige-se que haja alguma forma de atribuio da
memria inicial (malloc).
Ponteiros e matrizes
unidimensionais

 Reordenando uma lista de nmeros


 Observaes
Leitura dos elementos da matriz
Processo de ordenao
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Ponteiros e matrizes
multidimensionais
Ponteiros e matrizes
multidimensionais
 Vimos que uma vez que matrizes unidimensionais
podem ser representadas por um ponteiro (o nome
da matriz) e por um deslocamento (o subscript),
razovel imaginar que uma matriz multidimensional
pode ser representada com uma notao ponteiro
equivalente.
 Uma matriz bidimensional , na realidade, uma
coleo de matrizes unidimensionais.
 Podemos defini-la como um ponteiro para um
grupo de matrizes unidimensionais contguas.
Ponteiros e matrizes
multidimensionais

 Declarao
tipo (*ptr)[expr2]
Ao invs de: tipo matriz [expr1][expr2]
 Generalizao
tipo (*ptr)[expr2][expr3]...[exprn]
Que substitui: tipo matriz [expr1]
[expr2] ... [exprn]
Ponteiros e matrizes
multidimensionais

 Exemplo: suponha que x seja uma matriz


inteira bidimensional com 10 linhas e 20
colunas. Podemos declarar x como
int (*x)[20]
Ao invs de: int x[10][20]
 Na primeira declarao x definido como
um ponteiro para (elementos que so)
matrizes inteiras unidimensionais de
tamanho 20 contguos.
Ponteiros e matrizes
multidimensionais

x
...

x+1
...
. . . . . . .
. . . . . . .
. . . . . . .
x+9 ...
Este elemento pode ser acessado por *(*(x+1)+5)
Ponteiros e matrizes
multidimensionais

Como podemos acessar, por exemplo, o item na linha 1, coluna 5?

x[1][5]
ou
*(*(x+1)+5)

Primeiro, (x+1) um ponteiro para a linha 1. Portanto, o objeto desse


ponteiro, *(x+1), refere-se linha inteira. Como a linha 1 uma matriz
unidimensional, *(x+1) , na realidade, um ponteiro para o primeiro
elemento da linha 1. Adicionamos 5 a esse ponteiro. Por isso,
(*(x+1)+5) um ponteiro para o elemento 5 (na realidade o sexto
elemento) da linha 1. O objeto desse ponteiro *(*(x+1)+5).
Ponteiros e matrizes
multidimensionais

 Adio de duas tabelas (matrizes


bidimensionais) de nmeros usando um
ponteiro para um conjunto de matrizes
unidimensionais
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Vetores de Ponteiros
 Uma matriz multidimensional pode ser expressa
como uma matriz de ponteiros em vez de um
ponteiro para um grupo de matrizes contguas.
 Notao
tipo *matriz[expr1];
Ao invs da definio anterior notar a
tipo (*matriz)[expr2]; diferena

E tambm ao invs da definio convencional


tipo matriz[expr1][expr2];
Vetores de Ponteiros

 Notao
tipo *matriz[expr1];
 Observe que o nome da matriz e o asterisco
no esto entre parntesis.
 Assim, a regra EDP* associa os pares de
colchetes com matriz, definindo o objeto
como uma matriz. O asterisco estabelece
que a matriz conter ponteiros

* Esquerda para direita primeiro


Vetores de Ponteiros

X[0] ...

X[1] ...
. . . . . . .
. . . . . . .
. . . . . . .
X[9] ...

Esse elemento pode ser acessado por *(x[1]+5)


Vetores de Ponteiros

 Nova verso da adio de duas tabelas


(matrizes bidimensionais) de nmeros
usando matriz de ponteiros para matrizes
unidimensionais
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Vetores de Ponteiros

 Reordenando uma lista de strings. As strings


sero armazenadas como uma matriz de
ponteiros, onde cada ponteiro indica o incio
de uma string
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Matriz bidimensional
ponteiro de ponteiro

 Lendo e imprimindo uma matriz


bidimensional com ndices em tempo de
execuo.
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Passando Funes
para Outras Funes
Passando Funes
para Outras Funes

 possvel passar, como argumento, um ponteiro


para uma funo.
 Um argumento que um ponteiro para uma funo
pode ser declarado como
tipo (*nome-funcao)().
 Quando for chamar a funo (passada como
parmetro) tanto o * (operador indireto) como o
nome da funo devem estar entre parntesis.
(*pf)(arg1, arg2, .., argn).
Passando Funes
para Outras Funes

 Exemplo de passagem de funo para


outras funes.
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Passando Funes
para Outras Funes

 Outro exemplo de passagem de funo para


outras funes. Dessa vez foram includos
os tipos dos argumento nas declaraes de
funes.
 Exemplo (cdigo fonte)
 Exemplo (execuo)
Mais Sobre Declarao
de Ponteiros
Mais Sobre Declarao de
Ponteiros

 Declaraes de ponteiros podem ser


complicadas e necessrio algum cuidado
na sua interpretao, principalmente nas que
envolvem funes e matrizes.
 Uma das dificuldades o uso de parntesis
que tem duas utilidades
Indicar funes
Indicar precedncia
Mais Sobre Declarao de
Ponteiros

 O que significa int *p(int a)?


Uma funo que aceita um argumento int e retorna
um ponteiro para int.
 O que significa int (*p)(int a)?
Um ponteiro para uma funo que aceita um
argumento inteiro e retorna um inteiro
Primeiro par de parntesis = precedncia (ou
aninhamento)
Segundo par de parntesis = funo
Mais Sobre Declarao de
Ponteiros

 O que significa int *(*p)(int(*a)[])?


Um ponteiro para uma funo que aceita um
ponteiro para uma matriz de inteiros como
argumento e retorna um ponteiro para um int.
 O que significa int (*p)(char(*a)[])?
p um ponteiro para uma funo que aceita um
ponteiro para uma matriz de caracteres como
argumento e retorna um valor inteiro.
Mais Sobre Declarao de
Ponteiros

 O que significa int *(*p)(char *a[])?


p um ponteiro para uma funo que aceita uma
matriz de ponteiros para caracteres como
argumento e retorna um ponteiro para inteiros.
 O que significa int *(*p[7])(char a)?
p uma matriz de ponteiros (com 7 elementos)
para funes; cada funo aceita um caracter
como argumento e retorna um ponteiro para um
inteiro.
Mais Sobre Declarao de
Ponteiros

 O que significa int (*p[7])(char a)?


p uma matriz de ponteiros (com 7 elementos)
para funes; cada funo aceita um caractere
como argumento e retorna um valor inteiro.
 O que significa int *(*p[7])(char *a)?
p uma matriz de ponteiros (com 7 elementos)
para funes; cada funo aceita um ponteiro para
caractere como argumento e retorna um ponteiro
para um inteiro.

You might also like