Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do...

45
Ponteiros Prof. Gláucya Boechat [email protected]

Transcript of Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do...

Page 1: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

Ponteiros

Prof. Gláucya [email protected]

Page 2: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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;

Page 3: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 4: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 5: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

5

Tipos de Dados definidos no padrão ANSI

Tipos de Dados definidos no padrão ANSI

Page 6: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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>;

Page 7: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 8: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 9: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

9

Exemplo 1Exemplo 1

#include <stdio.h>

void main(){int x;int *y;

x = 1;y = &x;*y= 2;

printf("\n %d \n",x);}

Page 10: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 11: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 12: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

12

Exemplo 2Exemplo 2

#include <stdio.h>

void main(){int num, q=1;int *p;

num = 50;p = &num;q = *p;

printf("%d \n",q);}

Page 13: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

13

Exemplo 2Exemplo 2

#include <stdio.h>

void main(){int num, q=1;int *p;

num = 50;p = &num;q = *p;

printf("%d \n",q);}

pnum

1

q

Page 14: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

14

Exemplo 2Exemplo 2

#include <stdio.h>

void main(){int num, q=1;int *p;

num = 50;p = &num;q = *p;

printf("%d \n",q);}

50

pnum

1

q

Page 15: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

15

Exemplo 2Exemplo 2

#include <stdio.h>

void main(){int num, q=1;int *p;

num = 50;p = &num;q = *p;

printf("%d \n",q);}

50

pnum

1

q

Page 16: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

16

Exemplo 2Exemplo 2

#include <stdio.h>

void main(){int num, q=1;int *p;

num = 50;p = &num;q = *p;

printf("%d \n",q);}

50

pnum

50

q

Page 17: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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);}

Page 18: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 19: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 20: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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);}

Page 21: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 22: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 23: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 24: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 25: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 26: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 27: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 28: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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.

Page 29: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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) 

Page 30: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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);}

Page 31: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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);

}}

Page 32: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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;

Page 33: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

33

Ponteiro para PonteiroPonteiro para Ponteiro

Endereço

Ponteiro 2 Ponteiro 1 Variável

Endereço Valor

Page 34: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 35: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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);

}

Page 36: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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);

}

Page 37: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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]

Page 38: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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]

Page 39: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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]);}

Page 40: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 41: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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]);

Page 42: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 43: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 44: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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

Page 45: Ponteiros - UNICAMPglaucya/ifsp/EDI/EDI_ponteiros.pdf · 4 10 Memória Imagine a memória do computador como um grande vetor de células consecutivamentes numeradas. Para acessar

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”;