Ponteiros (parte 1) -...

42
1 Aula 07: - Mapa de memória de um processo - Ponteiros (parte 1) MCTA028 Programação Estruturada Prof. João Henrique Kleinschmidt Material elaborado pelo prof. Jesús P. Mena-Chalco 3Q-20108

Transcript of Ponteiros (parte 1) -...

Page 1: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

1

Aula 07:

- Mapa de memória de um processo

- Ponteiros (parte 1)

MCTA028 – Programação Estruturada

Prof. João Henrique Kleinschmidt

Material elaborado pelo prof. Jesús P. Mena-Chalco

3Q-20108

Page 2: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

2

Mapa de memória de um processo

Page 3: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

3

Alocação de memória: estática VS Dinâmica

Na execução, um programa é um processo.

Um processo ocupa parte da memória principal, reservada

para:

As instruções, e

A pilha

Page 4: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

4

INSTRUÇÕES

Armazena o códigocompilado(na linguagemmáquina)

[~bytes]

PILHA (STACK)

Armazena as variáveis ao longoda execução do programa.

[~Mbytes]

Processo na memória

Tamanho limitado

Page 5: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

5

INSTRUÇÕES

[~bytes]

PILHA (STACK)

[~Mbytes]

Processo na memória

HEAP

Espaço de memória principal gerenciado pelo SO.

[~Toda a memória RAM]

Tamanho limitado

Page 6: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

6

INSTRUÇÕES

[~bytes]

PILHA (STACK)

[~Mbytes]

Processo na memória

HEAP

Espaço de memória principal gerenciado pelo SO.

[~Toda a memória RAM]

int x;

double M[10][20];

char *c;

double M = malloc(...);

Alocação estática Alocação dinâmica

Page 7: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

7

Page 8: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

8

Maior elemento em um vetor

← Alocação estática

← Alocação dinâmica

← Alocação estática

Page 9: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

9

INSTRUÇÕES PILHA (STACK)

Processo na memória

HEAP

Ponteiros?

Em Java e Python o uso é transparente. Não precisa se preocupar de alocar e liberar memória

Page 10: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

10

INSTRUÇÕES PILHA (STACK)

Processo na memória

HEAP

Fenômeno: Stack Overflow

Page 11: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

11

Ponteiros

Page 12: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

12

Vetores e ponteiros

vetor

...

...int vetor[7] = {1,2,3,4,3,2,1}

Page 13: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

13

Vetores e ponteiros

...

...

Page 14: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

14

Endereços de memória

16¹²= 281 474 976 710 656

4 bits para representar cada número na base 16.

→ 12*4=48 bits → 2^48 (números diferentes)

Page 15: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

15

Large Synoptic Survey Telescope, LSST

http://www.lsst.org/lsst/

Telescopio Grande para Rastreos Sinópticos(Large Synoptic Survey Telescope, LSST):– 8,4 metros– capaz de examinar a totalidade do ceu visible– Norte do Chile (2016)– Camera de 3200 megapixels (~3 Gigapixels)

Planejado para armazenar mais de 30 Terabytes de dados de imagens por noite, mantendoem ~10 anos um banco de dados de 15 Petabytes

Page 16: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

16

Grande escala?

1000 kB kilobyte

1000² MB megabyte

1000³ GB gigabyte

1000⁴ TB terabyte

1000⁵ PB petabyte

1000⁶ EB exabyte

1000⁷ ZB zettabyte

1000⁸ YB yottabyte

http://mozy.com/blog/misc/how-much-is-a-petabyte/

Page 17: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

17

Endereços e ponteiros

(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.

Page 18: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

18

Endereços e ponteiros

Os conceitos de endereço e ponteiro são importantes em

qualquer linguagem de programação.

Na linguagem C é mais visível este conceito.

Requer um esforço para usar os ponteiros.

(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.

Page 19: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

19

Endereços

A memória de qualquer computador (arquitetura de Von

Neumann) é uma sequência de bytes.

Cada byte armazena um de 256 possíveis valores.

Os bytes são numerados sequencialmente e o número de um

byte é o seu endereço

(*) Fonte: http://codingfox.com/3-1-computer-memory-and-data-representation/

Page 20: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

20

Endereços

...

01010111

11000011

01100100

11100010

...

0x37FD00

0x37FD01

0x37FD02

0x37FD03

Page 21: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

21

Endereços

...

01010111

11000011

01100100

11100010

...

0x37FD00

0x37FD01

0x37FD02

0x37FD03

Cada objeto na memória do computador tem um endereço.

Page 22: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

22

Endereços

...

01010111

11000011

01100100

11100010

...

37FD00

37FD01

37FD02

37FD03

Geralmente o endereço do objeto é o endereço do 1ro byte.

Page 23: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

23

Endereços

Observe o símbolo &

Page 24: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

24

Endereços

Page 25: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

25

Endereços

Em c o endereço de um objeto é dado pelo operador &

Se x é uma variável, então &x é o seu endereço

int s = -9999

0x89422

-9999

s

Page 26: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

26

Endereços

Em c o endereço de um objeto é dado pelo operador &

Se x é uma variável, então &x é o seu endereço

int s = -9999

int *p = &s

0x89422

0x60001

p

p = 0x89422

&p = 0x60001

-9999

0x89422

*p = -9999

s

“p aponta para a s”

“p é o endereço de s”

“p aponta a s”

*p é o mesmo que escrever “s”

Page 27: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

27

Endereços

4

8

Page 28: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

28

Endereços

Todo ponteiro pode ter o valor NULL.

NULL é uma constante, geralmente vale 0

(definida no arquivo interface stdlib)

0

0x564320

p

int *p = NULL;

0x00000

Page 29: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

29

Endereços

Há vários tipos de ponteiros:

P. para caracteres

P. para inteiros

P. para registros

P. para ponteiros para inteiros

P. para função

int* p ;

int *p;

int * p;

← O “*” modifica a variável e não o int (mais aceito)

← Um tipo de dado novo int* (conceitualmente correto)

O compilador C aceita qualquer das formas.

Page 30: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

30

exemploPonteiro.c

Operadores unários& → Referência: na frente de uma variável:

Devolve o endereço de memória onde a variável está armazenada

* → Derreferência: na frente de variável ou expressão:

Devolve o valor ou conteúdo do endereço de memória apontadapela variável ou expressão

Page 31: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

31

exemploPonteiro.c

Page 32: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

32

exemploPonteiro2.c

Page 33: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

33

exemploPonteiro3.c

Page 34: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

34

exemploPonteiro3.c

Page 35: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

35

exemploPonteiro3.c

Por que o código abaixo está errado?

Page 36: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

36

Atividade em aula

Page 37: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

37

Questão 1

1. Os programas (trechos de código) abaixo possuem erros. Qual(is)? Como deveriam ser?

a)

void main() {

int x, *p;

x = 100;

p = x;

printf(“Valor de p: %d.\n”, *p);

}

//p deveria receber o endereço de x, já que p é um ponteiro (e x não). Ponteiros “armazenam” o endereço para

o qual eles apontam! O código correto seria: p = &x;

b) void troca (int *i, int *j) { int *temp; *temp = *i; *i = *j; *j = *temp; }A variável “temp” não precisava ser um ponteiro, já que apenas precisa armazenar um valor

inteiro, sem precisar apontar para algum lugar. O código correto seria: void troca (int *i, int *j) { inttemp; temp = *i; *i = *j; *j = temp; }

Page 38: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

38

Questão 2

2.Quais serão os valores de x, y e p ao final do trecho

de código abaixo?

int x, y, *p;

y = 0;

p = &y; //*p = 0

x = *p; //x = 0

x = 4; //x = 4

(*p)++; //*p = 1, y = 1

--x; //x = 3

(*p) += x; //*p = 4, y = 4

Ao final, temos: x = 3, y = 4, p apontando para y (*p = 4).

Page 39: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

39

Questão 3

3. Qual o resultado do código abaixo? Explique cada linha.

int x = 100, *p, **pp;

p = &x;

pp = &p;

printf(“Valor de pp: %d\n”, **pp);

int x = 100, *p, **pp; //x recebe o valor 100, p é um ponteiro para inteiro e pp é

um ponteiro para ponteiro para inteiro

p = &x; //p passa a apontar para o endereço de x (logo, *p tem o valor 100)

pp = &p; //pp passa a apontar para o endereço de p, logo *pp é o valor de pp, que

é o mesmo que p e **pp é o mesmo que *p, que é o mesmo que x (que é igual a

100)

printf(“Valor de pp: %d\n”, **pp); //imprime o valor de **pp, que é igual ao valor

de x, como mencionado na linha acima

Page 40: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

40

Questão 4

4. Qual será a saída do programa abaixo para

a) x=3 e y=4 (3 e 18)

b) x=6 e y=9 (6 e 83)

#include <stdio.h>

void func(int *px, int *py)

{

px = py;

*py = (*py) * (*px);

*px = *px + 2;

printf("x = %d, y = %d", *px, *py);

}

void main(void)

{

int x, y;

scanf("%d",&x);

scanf("%d",&y);

func(&x,&y);

printf("x = %d, y = %d", x, y);

}

Page 41: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

41

Questão 5

5. Escreva uma função mm que receba um vetor inteiro v[0..n-1], o número de elementos

do vetor e os endereços de duas variáveis inteiras, digamos min e max, e deposite nessas

variáveis o valor de um elemento mínimo e o valor de um elemento máximo do vetor.

Escreva também uma função main que use a função mm.

Ex: void mm(int *v, int n, int *min, int *max)

Page 42: Ponteiros (parte 1) - professor.ufabc.edu.brprofessor.ufabc.edu.br/~joao.kleinschmidt/aulas/prog2018/aula_07... · do vetor e os endereços de duas variáveis inteiras, digamos min

42

Questão 5

int main() {

int n, i, *vet, minimo, maximo;

printf("Quantos numeros voce deseja digitar? ");

scanf("%d", &n);

vet = malloc(n * sizeof(int));

for (i = 0; i < n; i++) {

printf("Digite o numero de indice %d: ", i);

scanf("%d", &vet[i]);

}

mm(vet, n, &minimo, &maximo);

printf("Minimo: %d. Maximo: %d.\n", minimo,

maximo);

return 0;

}

void mm(int *v, int n, int *min, int *max) {

int i;

*min = v[0];

*max = v[0];

for (i = 1; i < n; i++) {

if (v[i] > *max) {

*max = v[i];

}

else if (v[i] < *min) {

*min = v[i];

}

}

}