Ponteiro
Inicialização de ponteiros
•
•
•
variável que armazena o endereço de uma
variável de um determinado tipo
declaração: <tipo> *<identificador>;
•
onde tipo pode ser qualquer tipo válido em C
–
Ex.: int *nota;
char *texto;
float *peso;
double *media;
//
//
//
//
ptrs ainda não
inicializados apontam p/ lugar
indefinido
1
•
•
•
pt = &x;
decl. do ptr
inicializ. - pt pode ser
usado em qualquer contexto
que x seria
int x, q, *pt;
x = 100;
pt = &x;
// pt recebe o end. de x (“aponta para”)
q = *pt;
// q recebe o conteúdo do end. de pt
Profa. Patrícia Pitthan
operador unário que obtém o conteúdo da variável
localizada no endereço que o segue (formato %p)
operador usado para declarar um ponteiro ou para obter o
conteúdo da variável apontada
Ex.:
4
int main(){
int x, q, *pt;
x = 100;
pt = &x;
// pt recebe o endereço de x
q = *pt;
// q recebe o conteúdo do end. de pt
}
Se a variável pt aponta para um endereço que contém o
valor 100, o valor de q será 100
Profa. Patrícia Pitthan
Profa. Patrícia Pitthan
Profa. Patrícia Pitthan
Ponteiros:: exemplo 1
Ponteiros
int x, q, *pt;
x = 100;
pt = &x;
// pt recebe o end. de x
q = *pt;
// q recebe o conteúdo do end. de pt
5
operador unário que obtém o endereço de memória
de uma variável (formato hexa: %X ou %x)
Se a variável x está armazenada na posição de memória
2000, o valor de pt será 2000
Ponteiros:: operador * (dereferência
Ponteiros
(dereferência))
*
Profa. Patrícia Pitthan
Ex.:
O ponteiro guarda o endereço
O endereço aponta para um valor
3
pt = NULL;
Ponteiros:: operador &
Ponteiros
Ponteiro tem 2 partes:
–
–
OU
2
&
//
//
//
//
O valor de um ponteiro é desconhecido
Para um ponteiro não apontar para um local
inválido (lixo), deve ser inicializado ou receber o
valor NULL
Ex.:
Profa. Patrícia Pitthan
Ponteiros:: declaração e inicialização
Ponteiros
int x = 10;
int *pt;
pt = &x;
Após ser declarado e antes de receber um valor
–
printf(“x = %d\n”, x);
printf(“q = %d\n”,q);
printf(“pt = %p\n”,pt); // %p – formato p/ ponteiro
printf(“pt aponta para %d\n\n”,*pt); // conteúdo da
// memória apontada por pt
x = 100
q = 100
pt = 0022FF74
pt aponta para 100
6
Profa. Patrícia Pitthan
1
Ponteiros:: exemplo 2
Ponteiros
Atribuições com Ponteiros
i = 9
&i = 22FF74
p = 0022FF74
*p = 9
&p = 22FF70
q = 0022FF74
*q = 9
&p = 22FF6C
int main(){
int i, *p, *q;
i = 9;
p = &i; // p aponta para i
q = p;
// q também aponta para i
printf("i = %d \n",i);
// valor de i
printf("&i = %X\n", &i); // end de i
printf("p = %p \n", p); // end apontado
printf("*p = %d\n", *p); // cont. do end apontado por p
printf("&p = %X\n", &p); // end de p
printf("q = %p \n", q); // end apontado
printf("*q = %d\n", *q); // cont. do end apontado por q
printf("&q = %X\n", &q); // end de q
}
7
• Como qualquer variável, um ponteiro pode ser usado no
lado direito de um comando de atribuição, passando seu
valor para outro ponteiro
– Ex.:
int x, *p1, *p2;
p1 = &x;
//p1 aponta para x
p2 = p1;
//p2 recebe p1 e tb aponta p/ x
printf(“%p”, p2);
//escreve o end. de x
Profa. Patrícia Pitthan
8
Profa. Patrícia Pitthan
Atribuições com Ponteiros
Ponteiros:: exemplo
Aritmética de Ponteiros
int main(){
int a, *x,*y;
a = 10;
x = &a;
y = x;
printf("*x = %d, *y
printf("x = %p, y =
*x = 20;
printf("*x = %d, *y
printf("x = %p, y =
}
*x = 10, *y = 10
x = 0022FF74, y =
*x = 20, *y = 20
x = 0022FF74, y =
• Ao ser incrementado, o ptr passa a apontar p/ a
posição de memória do próximo elemento do seu
tipo base
• Ao ser decrementado, o ptr passa a apontar p/ a
posição de memória do elemento anterior do seu
tipo base
• O valor do ponteiro irá aumentar ou diminuir
dependendo do nro de bytes que o tipo base
ocupa
= %d \n", *x, *y);
%p\n\n", x, y);
= %d \n", *x, *y);
%p\n\n", x, y);
0022FF74
0022FF74
9
Profa. Patrícia Pitthan
Aritmética de Ponteiros
10
Profa. Patrícia Pitthan
Aritmética de Ponteiros
• Adição e subtração de ponteiros
– Se p1 é um ptr p/ inteiro com valor inicial 2000
– Cada inteiro ocupa 2 bytes
– Após o comando p1++, o valor de p1 passa a ser 2002 (p1
passa a apontar para o próximo inteiro)
– Idem para decremento (p1--)
int *pi = 3000;
char *pc = 4000;
double *pd = 5000;
pi++;
pc++;
pd++;
// int ocupa 4 bytes
// char ocupa 1 byte
// double ocupa 8 bytes
// pi apontará p/ end. 3004
// pc apontará p/ end. 4001
// pd apontará p/ end. 5008
• Soma e subtração de inteiros de ponteiros
p1 = p1+10;
//faz p1 apontar para o 10º
elem. do tipo p1 (adiante do
elem. atualmente apontado por p1)
11
Profa. Patrícia Pitthan
Profa. Patrícia Pitthan
12
Profa. Patrícia Pitthan
2
Aritmética de Ponteiros
Ponteiros:: na memória
int x, *p;
x = 10;
p = &x;
p++;
Aritmética de Ponteiros (1a)
int x,*y;
• “x” e “y” ocupam 4 bytes consecutivos
cada
• “x” (“y”) inicia no endereço 1000
(1004) e termina no endereço 1003
(1007)
• O endereço de “x” (“y”) é 1000 (1004)
• Os valores iniciais de “x” e de “y” são
indeterminados
• “x” é do tipo inteiro e “y” é do tipo
ponteiro para inteiro
13
Profa. Patrícia Pitthan
Aritmética de Ponteiros (1b)
15
14
Profa. Patrícia Pitthan
Aritmética de Ponteiros (1c)
Profa. Patrícia Pitthan
Aritmética de Ponteiros (2a)
16
Profa. Patrícia Pitthan
Aritmética de Ponteiros (2b)
int x,*y,*z;
• “x” é do tipo inteiro
• “y” é do tipo ponteiro para inteiro
• “z” é do tipo ponteiro para inteiro
17
Profa. Patrícia Pitthan
Profa. Patrícia Pitthan
18
Profa. Patrícia Pitthan
3
Aritmética de Ponteiros (2c)
Aritmética de Ponteiros (3a)
int x,*y,**z;
• “x” é do tipo inteiro
• “y” é do tipo ponteiro para inteiro
• “z” é do tipo ponteiro para ponteiro
para inteiro
19
Profa. Patrícia Pitthan
Aritmética de Ponteiros (3b)
21
Profa. Patrícia Pitthan
Profa. Patrícia Pitthan
Aritmética de Ponteiros (3c)
Profa. Patrícia Pitthan
Aritmética de Ponteiros (3d)
23
20
22
Profa. Patrícia Pitthan
Aritmética de Ponteiros (Resumo
Resumo))
Profa. Patrícia Pitthan
Operação
Exemplo
Atribuição
int *p,*q;
p=&x;
q=p;
Obs
Incremento
p++;
p=p+2;
p aponta p/ próx. valor do mesmo tipo
incremento de 2*sizeof(tipo) de p
Decremento
p--;
p=p-4;
p aponta p/ valor anterior do mesmo tipo
decremento de 4*sizeof(tipo) de p
Apontado por
*p
conteúdo da posição apontada por p
Endereço de
&p
endereço de p
Diferença
p-q
nro de elementos entre p e q
Comparação
p > q
ptr que aponta p/ posição mais alta na
memória
p e q apontam para x
24
Profa. Patrícia Pitthan
4
Download

Profa. Patrícia Pitthan 1