ponteiros - unicampglaucya/ifsp/edi/edi_ponteiros.pdf · 4 10 memória imagine a memória do...
TRANSCRIPT
Ponteiros
Prof. Gláucya [email protected]
2
VariáveisVariáveis
● Uma variável é uma posição nomeada de memória.
● Usada para guardar um valor que pode ser modificado pelo programa.– Exemplo de declaração
int a = 5;char b = 'x';Float c = 12.23;
3
VariáveisVariáveis● Cada variável possui
– Um nome
– Um endereço de memória ou referência
– Um valor
● Exemplo
– Nome
– Endereço de memória
– Valor
int x = 10;
x
0xabf236
10
4
10
MemóriaMemória
● Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas.
● Para acessar o endereço de uma variável, utilizamos o operador &
● Exemplo
x
100 101 102 103 104 105
int x = 10;
......
// &x = 101
5
Tipos de Dados definidos no padrão ANSI
Tipos de Dados definidos no padrão ANSI
6
PonteirosPonteiros● Ponteiros (apontadores ou pointer) são tipos
especiais de variáveis– Que armazena um endereço de memória
– Um ponteiro pode ter o valor NULL● Quando não contém nenhum endereço
● Declaração
– Exemplos
int *ap_int; char *ap_char;float *ap_float;double *ap_double;
<TIPO> *<NOME DA VARIÁVEL>;
7
PonteirosPonteiros
● O operador & captura o endereço de uma variável.
int x = 10;int *ap_x;
ap_x = &x; // ap_x aponta para x
10410
x
100 104 108 112 116 120 ......
ap_x
8
PonteirosPonteiros
● O operador * acessa o conteúdo do endereço apontado pelo ponteiro
int x = 10;int *ap_x;
ap_x = &x; //ap_x aponta para xprintf("%d\n", *ap_x); // 10
10410
x
100 104 108 112 116 120 ......
ap_x
9
Exemplo 1Exemplo 1
#include <stdio.h>
void main(){int x;int *y;
x = 1;y = &x;*y= 2;
printf("\n %d \n",x);}
10
Exemplo 1Exemplo 1
#include <stdio.h>
void main(){int x;int *y;
x = 1;y = &x;*y= 2;
printf("\n %d \n",x);}
1
yx
11
Exemplo 1Exemplo 1
#include <stdio.h>
void main(){int x;int *y;
x = 1;y = &x;*y= 2;
printf("\n %d \n",x);}
2
yx
12
Exemplo 2Exemplo 2
#include <stdio.h>
void main(){int num, q=1;int *p;
num = 50;p = #q = *p;
printf("%d \n",q);}
13
Exemplo 2Exemplo 2
#include <stdio.h>
void main(){int num, q=1;int *p;
num = 50;p = #q = *p;
printf("%d \n",q);}
pnum
1
q
14
Exemplo 2Exemplo 2
#include <stdio.h>
void main(){int num, q=1;int *p;
num = 50;p = #q = *p;
printf("%d \n",q);}
50
pnum
1
q
15
Exemplo 2Exemplo 2
#include <stdio.h>
void main(){int num, q=1;int *p;
num = 50;p = #q = *p;
printf("%d \n",q);}
50
pnum
1
q
16
Exemplo 2Exemplo 2
#include <stdio.h>
void main(){int num, q=1;int *p;
num = 50;p = #q = *p;
printf("%d \n",q);}
50
pnum
50
q
17
Exemplo 3Exemplo 3
#include <stdio.h>
void main(){float x = 1.0, y =10.0;float *p = &x;
y = (*p) + 5.0;
printf("%f \n",y);}
18
Exemplo 3Exemplo 3
#include <stdio.h>
void main(){float x = 1.0, y =10.0;float *p = &x;
y = (*p) + 5.0;
printf("%f \n",y);}
1.0
p x
10.0
y
19
Exemplo 3Exemplo 3
#include <stdio.h>
void main(){float x = 1.0, y =10.0;float *p = &x;
y = (*p) + 5.0;
printf("%f \n",y);}
1.0
p x
4.0
y
20
Expressões com ponteirosExpressões com ponteiros● Atribuição de ponteiros
– Como qualquer variável, um ponteiro pode passar seu valor para outro ponteiro.
#include <stdio.h>
void main(){int x = 10;int *p,*q;
p = &x;q = p;
printf("%d \n",*q);}
21
Expressões com ponteirosExpressões com ponteiros
#include <stdio.h>
void main(){int x = 10;int *p,*q;
p = &x;q = p;
printf("%d \n",*q);}
10
pnum
q
● Atribuição de ponteiros
22
Expressões com ponteirosExpressões com ponteiros
#include <stdio.h>
void main(){int x = 10;int *p,*q;
p = &x;q = p;
printf("%d \n",*q);}
10
pnum
q
● Atribuição de ponteiros
23
Expressões com ponteirosExpressões com ponteiros
#include <stdio.h>
void main(){int x = 10;int *p,*q;
p = &x;q = p;
printf("%d \n",*q);}
10
pnum
q
● Atribuição de ponteiros
24
Expressões com ponteirosExpressões com ponteiros
● Operador de Incremento – Quando um ponteiro é incrementado, ele aponta para
a posição de memória do próximo elemento do seu tipo base.
– Exemplo ● Considere ap_int um ponteiro para o tipo int com valor atual 200. ● De acordo com a tabela do padrão ANSI, o tipo int possui 4 bytes.
ap_int ++
● Após a expressão ap_int terá o valor 204
25
Expressões com ponteirosExpressões com ponteiros
● Operador de Incremento – Exemplo
● ap_int ++
20052
x
196 200 204 208 212 216 ......
ap_int
20452
x
196 200 204 208 212 216 ......
ap_int
y
y
26
Expressões com ponteirosExpressões com ponteiros
● Operador de decremento– Cada vez que é decrementado, o ponteiro irá
apontar para a posição do elemento anterior.
– Exemplo ● Considere ap_int um ponteiro para o tipo int com valor atual
200.
ap_int --
● Após a expressão ap_int terá o valor 196
27
Expressões com ponteirosExpressões com ponteiros
● Operador de decremento– Exemplo
● ap_int --
200210
y
196 200 204 208 212 216 ......
ap_int
196210
196 200 204 208 212 216 ......
ap_int
x
yx
28
Expressões com ponteirosExpressões com ponteiros
● Operador de adição e subtração– Além das operações de incremento e decremento é
possível somar ou subtrair inteiros de ponteiros.
– Exemplo
ap_int = ap_int + 12
● Faz ap_int apontar para o décimo segundo elemento do tipo ap_int adiante do elemento que ele está atualmente apontando.
29
Expressões com ponteirosExpressões com ponteiros● Comparação de ponteiros
– É possível fazer comparações entre ponteiros ou conteúdos apontados por estes.
●(ponteiro_a > ponteiro_b)
●(ponteiro_a < ponteiro_b)
●(ponteiro_a == ponteiro_b)
●(*ponteiro_a == *ponteiro_b)
30
Expressões com ponteirosExpressões com ponteirosvoid main(){
int *a, *b, c=5, d=5; b=&c; a=&d;
if(a>b){printf("\nO endereco apontado por a(%p) é maior
que o endereco apontado por b(%p)",a,b); } else if(a<b){
printf("\nO endereco apontado por a(%p) é menor que o endereco apontado por b(%p)",a,b); } else{ //(a==b)
printf("\n a e b possuem o mesmo endereco: %p",a); } if(*a==*b)
printf("\n a e b possuem o mesmo valor: %d",*a);}
31
Expressões com ponteirosExpressões com ponteiros
● Comparação de ponteiros
– É possível verificar se um ponteiro está apontando para uma posição válida.
void main(void){int *a = NULL, *b = NULL, c=5;
a=&c;
if(a != NULL){b = a;printf("Numero : %d", *b);
}}
32
Ponteiro para PonteiroPonteiro para Ponteiro
● É possível um ponteiro apontar para outro ponteiro– Que aponta para o valor final
● Declaração
● Exemplo
<TIPO> **<NOME DA VARIÁVEL>;
int **ap_int; char **ap_char;float **ap_float;double **ap_double;
33
Ponteiro para PonteiroPonteiro para Ponteiro
Endereço
Ponteiro 2 Ponteiro 1 Variável
Endereço Valor
34
216
220 224 228
Ponteiro para PonteiroPonteiro para Ponteiro
● Exemplo
20010
x
196 200 204 208 212 216 ......
void main(){int x, *p, **q;x = 10;p = &x;q = &p;printf(“%d”,**q); // imprime o valor de x
}
p q
35
Ponteiros e funçõesPonteiros e funções
● Passagem por referência#include <stdio.h>
void troca(int *x, int *y){ int temp;
temp = *x;*x = *y;*y = temp;
}
void main(){int a = 8, b =3 , *ap1 = &a, *ap2 = &b;troca(&a, &b); // a = 3, b = 8 troca(ap1, ap2); // a = 8, b = 3printf("a=%d e b=%d",a,b);
}
36
ExemploExemplo#include <stdio.h>
void minEMax(int vet[], int tam, int *min, int *max){int i;*max = vet[0];*min = vet[0];for(i = 0; i < tam; i++){
if(vet[i] < *min)*min = vet[i];
if(vet[i] > *max)*max = vet[i];
}}
void main(){int vet[] = {15, 8, 5, 1, 55, 20, 20, 97, 10};int min, max;minEMax(vet, 9, &min, &max);printf("Menor = %d \nMaior = %d \n",min, max);
}
37
Vetores e PonteirosVetores e Ponteiros● Uma variável vetor, assim como um ponteiro,
armazena um endereço de memória– O endereço do início do vetor.
● Exemplo– A variável vet contém o endereço de memória do
início do vetor
10011101
200 204 208 212vet
int vet[4] = {1,10,11,100}
vet[0] vet[1] vet[2] vet[3]
38
Vetores e PonteirosVetores e Ponteiros● Quando passamos um vetor como um
argumento de uma função, ● Exemplo
– A variável vet contém o endereço de memória do início do vetor
10011101
200 204 208 212vet
int vet[4] = {1,10,11,100}
vet[0] vet[1] vet[2] vet[3]
39
ExemploExemplo#include <stdio.h>
void zeraVet(int vet[], int tam){int i;for(i = 0; i < tam; i++)
vet[i] = 0;}
void main(){int vetor[] = {1, 2, 3, 4, 5};int i;
zeraVet(vetor, 5);for(i = 0; i<5; i++)
printf("%d, ", vetor[i]);}
40
Vetores e PonteirosVetores e Ponteiros
● A variável vetor pode ser atribuída para um ponteiro como:
int vet[] = {1,2,3,4};int *ap_vet;
ap_vet = vet;
4321
vet[0] vet[1] vet[2] vet[3] ap_vet
200 204 208 212vet
41
Vetores e PonteirosVetores e Ponteiros
● Um ponteiro também pode ser usado como um vetor:
int vet[] = {1,2,3,4};int *ap_vet, i;
ap_vet = vet; //ap_vet = &vet[0];
for(i=0; i<4; i++) printf(“%d , ”,ap_vet[i]);
42
Vetores e PonteirosVetores e Ponteiros
● Atribuição
int vet[] = {1,2,3,4};int *ap_vet, x;
ap_vet = vet;
x = *ap_vet; // x = vet[0]
1
x
4321vet
ap_vet
vet[0] vet[1] vet[2] vet[3]
200 204 208 212
43
Vetores e PonteirosVetores e Ponteiros
● Atribuição
– Se ap_vet aponta para vet[0],então● ap_vet+1 aponta para vet[1],
– *(ap_vet+1) é o conteúdo vet[1],
int vet[] = {1,2,3,4};int *ap_vet;
ap_vet = vet;
4321vet
ap_vet
vet[0] vet[1] vet[2] vet[3]
200 204 208 212
44
Vetores e PonteirosVetores e Ponteiros
● Atribuição
– Se ap_vet aponta para vet[0],então● ap_vet+i aponta para vet[i],
– *(ap_vet+i) é o conteúdo vet[i],
int vet[] = {1,2,3,4};int *ap_vet;
ap_vet = vet;
4321vet
ap_vet
i = 3vet[0] vet[1] vet[2] vet[3]
200 204 208 212
45
Strings e PonteirosStrings e Ponteiros
● Uma string pode ser declarada como uma matriz de caracteres
● Ou como um ponteiro para caracteres
char str[18] = “exemplo de string”;
char *str = “outro exemplo de string”;