Вы находитесь на странице: 1из 12

Programação II

Acetatos das Aulas Teóricas - 2011


CAP – 9: Ponteiros (Apontadores)
 Definição
◦ É o tipo de dados usados para guardar endereços
de memória.
◦ O endereço que eles guardam pode conter
qualquer tipo de dados (int, char, float, double,
struct, outro ponteiro)
 Declaração:
◦ Para declarar um ponteiro usa-se o operador ‘*’.
◦ A sintaxe para declarar um ponteiro é:
tipo_de_dados *nome_da_variável;
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 2
Ponteiros - Declaração
 Inicialmente, após declaração, o ponteiro
aponta para NULL (diz-se vazio ou nada).
 Exemplo: 2 Bytes

 int *pt, *ptr; pt int

 char *nome; nome


char

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 3
Ponteiros - Atribuições
 Endereço
◦ Para se atribuir um endereço à um ponteiro
usa-se o operador ‘&’, antes da variável
apontadora. Endereço 660, na MEM
a 33
int a = 33, *ptr;
ptr
ptr = &a;

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 4
Ponteiros - Conteúdo
 Conteúdo Apontado
◦ O valor contido no endereço de memória
apontado por um ponteiro pode ser acedido
usando o operador * (conteúdo)
◦ Neste caso coloca-se o operador antes do
nome do apontador, como no exemplo
abaixo: Endereço 660, na MEM

a 33
int y, a = 33, *ptr;
ptr
ptr = &a;

y = *ptr; //y=a=33; UniMETRO/FATEC/LCC-BIF


ProgramaçãoII/ M.T.Ditutala 5
Ponteiros – Atribuição de Endereços
 Com dois (2) apontadores para o mesmo
tipo de dados podemos fazer:
 Atribuição de Endereços
tipo_dado y, *pt1, *pt2=NULL;
pt1 = &y;
pt2 = pt1
◦ pt2 passa a apontar para o mesmo
endereço de memoria que pt1.
◦ Neste caso usar pt1 ou pt2 é a mesma
coisa.
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 6
Ponteiros – Atribuição de Endereços
 Com dois (2) apontadores para o mesmo
tipo de dados podemos fazer:
 Atribuição do Conteúdo (valor)
tipo_dado y=15, *pt1, *pt2=NULL;
pt1 = &y; //*pt1 = 15
*pt2 = *pt1
◦ O conteudo no endereço de memoria
apontado por pt2 passa a ser igual ao
conteudo actual do endereço apontado
por pt1.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 7
Ponteiros – Operador Incremento
 Os ponteiros são, em geral, usados para representar
uma sequência de dados, sendo cada um localizado no
seu endereço de memória.
 Pode-se assim usando dos ponteiros aceder a todos
esses dados, desde que se conheça o primeiro
 Essa operação é feita usando o operador incremento.
 Nestes casos os incrementos são sempre múltiplos,
em Bytes dos tipos de dados que representam.
 Por exemplo:
◦ Ponteiros para int o incremento é de 2Bytes cada
◦ Ponteiros para char o incremento é de 1Byte cada
◦ Ponteiros para float o incremento é de 4Bytes cada
◦ Etc.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 8
Ponteiros – Operador Incremento
 1º Caso
 Se pt é um ponteiro e y um int, então a operação
pt++
◦ Incrementa o endereço de pt para x Bytes,
pt + y
◦ Incrementa o endereço apontado por pt de y*x Bytes
 Em ambos casos x é o número de bytes do tipo
apontado por pt.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 9
Ponteiros – Operador Incremento
 2º Caso
 Se pt é um ponteiro e y um int, então a operação
(*pt)++
◦ Incrementa o conteúdo apontado por pt de 1,
(*pt) + y
◦ Incrementa o conteúdo apontado por pt de y

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 10
Ponteiros – Operador Incremento
 3º Caso
 Se pt é um ponteiro e y um int, então a operação
*pt++
◦ Do facto do operador ++ ter maior precedência do que o
*, esta operação resulta em:
◦ *(pt++)
◦ Isto é retorna o valor actual de pt
◦ De seguida incrementa o endereço de pt de 1 unidade
 x=*(pt+y)
 Atribui a x o conteúdo do endereço de pt
incrementado de y
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 11
Ponteiros vs Vectores
 Vectores são caso particular de ponteiros,
disto resultam algumas relações
 Se tivermos a seguinte declaração:
 tipo1 vect[ ], *ptr
 Então são válidas as expressões:
 ptr = vect = &vect[0];
 ptr[i] = *(ptr+i) = *(vect+i)

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 12

Вам также может понравиться