Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores...

39
Slides cedidos por 8.1

Transcript of Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores...

Page 1: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Programação de Computadores IIAula 16. Ponteiros II

Slides cedidos por Karina Mochetti

2018.1

Aula 16. Ponteiros II

Page 2: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exercício Aula Passada

Qual a diferença entre os dois códigos abaixo?

char* str = "Hello World";

for (int i = 0; i < strlen(str); i++)

printf("%c", str[i]);

char* str = "Hello World";

for (; *str != '\0'; str++)

printf("%c", *str);

Ambos imprimirão a mesma coisa na tela!!!

Aula 16. Ponteiros II

Page 3: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Endereço e Ponteiro

Endereço

Ao colocarmos o símbolo & temos o endereço daquela variável.

Ponteiro

Ao colocarmos o símbolo * temos o valor da variável armazenada

num determinado endereço.

int *p;

int n=0;

p = &n;

0x003A4581: 0x003A4585 p

0x003A4585: 0x00000000 n

p

0x003A4589: 0x19374998

O valor de n eh: 0x00000000O endereço de n é: 0x003A4585O valor de *n é: ERRORO valor de p é: 0x003A4585O endereço de p é: 0x003A4581O valor de *p é: 0x00000000

Aula 16. Ponteiros II

Page 4: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Endereço e Ponteiro

Ponteiros e endereços são sempre utilizados juntos.

Aula 16. Ponteiros II

Page 5: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Registro

typedef struct aluno {

int matricula;

float nota;

char nome[50];

} Aluno;

int main() {

Aluno a;

Aluno *p;

p = &a;

return 0;

}

A variável p terá o tamanho de um endereço de memória (4

bytes).

A região apontada por p terá o tamanho do tipo Aluno (58

bytes).Aula 16. Ponteiros II

Page 6: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Registro

typedef struct aluno {

int matricula;

float nota;

char nome[50];

} Aluno;

int main() {

Aluno a;

Aluno *p;

p = &a;

return 0;

}

Aula 16. Ponteiros II

Page 7: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Registro

typedef struct aluno {

int matricula;

float nota;

char nome[50];

} Aluno;

int main() {

Aluno a;

Aluno *p;

p = &a;

return 0;

}

A variável nome terá o mesmo tamanho da variável p, o

tamanho de um endereço de memória.

Aula 16. Ponteiros II

Page 8: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Registro

typedef struct aluno {

int matricula;

float nota;

char nome[50];

} Aluno;

int main() {

Aluno a;

Aluno *p;

p = &a;

(*p).nota = 10;

p->nota = 10;

a.nota = 10;

return 0;

}

(*p).nome é equivalente a p->nome.

Aula 16. Ponteiros II

Page 9: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Ponteiro para Ponteiro

int main() {

int a = 10;

int *p, **q, ***r;

p = &a;

q = &p;

r = &q;

printf("O endereco de r é %d", &r);

printf("O valor de r é %d", r);

printf("O valor de *r é %d", *r);

printf("O valor de **r é %d", **r);

printf("O valor de ***r é %d", ***r);

return 0;

}

O endereco de r é 0x005D334AF

O valor de r é 0x005D334AB

O valor de *r é 0x005D334A7

O valor de **r é 0x005D334A3

O valor de ***r é 10

Aula 16. Ponteiros II

Page 10: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

int a = 10, b = 20;

int *p, *q;

p = &a;

*q = 10;

q = &b;

*p = 15;

p = &a;

return 0;

}

Aula 16. Ponteiros II

Page 11: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

int a = 10, b = 20;

int *p, *q;

p = &a;

*q = 10;

q = &b;

*p = 15;

p = &a;

return 0;

}

Aula 16. Ponteiros II

Page 12: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

int a = 10, b = 20;

int *p, *q;

p = &a;

q = NULL;

*q = 10;

q = &b;

*p = 15;

p = &a;

return 0;

}

Aula 16. Ponteiros II

Page 13: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

int a = 10, b = 20;

int *p, *q;

p = &a;

q = &b;

*q = 10;

*p = 15;

p = &a;

return 0;

}

Aula 16. Ponteiros II

Page 14: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

char* str1, str2, str3;

str1 = "Hello World";

str2 = "Hello";

printf("%c", str1[0]);

printf("%c", str2[0]);

printf("%c", str3[0]);

return 0;

}

Aula 16. Ponteiros II

Page 15: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

char* str1, str2, str3;

str1 = "Hello World";

str2 = "Hello";

printf("%c", str1[0]);

printf("%c", str2[0]);

printf("%c", str3[0]);

return 0;

}

Aula 16. Ponteiros II

Page 16: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

Um erro desse faz com que o programa pare imediatamente!

Um printf() normalmente é escrito no bu�er e não aparece na

saída padrão imediatamente.

Um Seg Fault pode ocorrer depois de um printf() e, como ele

ainda estava no bu�er, não ser direcionado para a saída

padrão.

Para testar e debugar seu programa utilize a saída de erro

padrão, ela não vai para o bu�er, é escrita imediatamente.

Aula 16. Ponteiros II

Page 17: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Segmentation Fault

Normalmente ocorrem quando há a tentativa de acessar uma região

de memória que o programa não tem acesso.

int main() {

int a = 10;

int *p;

p = &a;

p = NULL;

printf("Erro.");

*p = 20;

return 0;

}

Segmentation Fault.

int main() {

int a = 10;

int *p;

p = &a;

p = NULL;

fprintf(stderr, "Erro.");

*p = 20;

return 0;

}

Erro.

Segmentation Fault.

Aula 16. Ponteiros II

Page 18: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Parênteses

Ponteiros são inteiros, portanto, é permitido fazer contas aritmética

com eles.

int main() {

int n = 10;

int *p;

p = &n;

return 0;

}

0x003A4581: 0x0000000A

p

n

0x003A4585: 0x003A4581

p

p

0x003A4589: 0xC0FE5409

p⇒ p

0x003A458D: 0x45413200

p⇒ q

0x003A4591: 0x4B432BC8

p⇒ n

0x003A4595: 0x19374998

p⇒ n

Aula 16. Ponteiros II

Page 19: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Parênteses

Ponteiros são inteiros, portanto, é permitido fazer contas aritmética

com eles.

int main() {

int n = 10;

int *p;

p = &n;

(*p)++;

return 0;

}

0x003A4581: 0x0000000B

p

n

0x003A4585: 0x003A4581

p

p

0x003A4589: 0xC0FE5409

p⇒ p

0x003A458D: 0x45413200

p⇒ q

0x003A4591: 0x4B432BC8

p⇒ n

0x003A4595: 0x19374998

p⇒ n

Aula 16. Ponteiros II

Page 20: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Parênteses

Ponteiros são inteiros, portanto, é permitido fazer contas aritmética

com eles.

int main() {

int n = 10;

int *p;

p = &n;

*p++;

return 0;

}

0x003A4581: 0x0000000A

p

n

0x003A4585: 0x003A4585

p

p

0x003A4589: 0xC0FE5409

p⇒ p

0x003A458D: 0x45413200

p⇒ q

0x003A4591: 0x4B432BC8

p⇒ n

0x003A4595: 0x19374998

p⇒ n

Aula 16. Ponteiros II

Page 21: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Parênteses

Ponteiros são inteiros, portanto, é permitido fazer contas aritmética

com eles.

As operações aritméticas com ponteiros são feitas na unidade

do tamanho do tipo guardado nele.

Aula 16. Ponteiros II

Page 22: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `a';

char b = `e';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0xB9

p c

0x003A4582: 0xAC

p b

0x003A4583: 0xC0FE5409

p p

0x003A4587: 0x45413200

p q

0x003A458B: 0x4B432BC8

p⇒

eSegmentation Fault.

Aula 16. Ponteiros II

Page 23: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0xAC

p b

0x003A4583: 0xC0FE5409

p p

0x003A4587: 0x45413200

p q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 24: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0xC0FE5409

p p

0x003A4587: 0x45413200

p q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 25: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0xC0FE5409

p

p

0x003A4587: 0x45413200

p

q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 26: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0x003A4587

p

p

0x003A4587: 0x45413200

p

q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 27: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0x003A4587

p

p

0x003A4587: 0x003A4581

p

q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 28: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0x003A458B

p

p

0x003A4587: 0x003A4581

p

q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 29: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0x003A458B

p

p

0x003A4587: 0x003A4582

p

q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 30: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0x003A458B

p

p

0x003A4587: 0x003A4582

p

q

0x003A458B: 0x4B432BC8

p⇒

E

Segmentation Fault.

Aula 16. Ponteiros II

Page 31: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

c

0x003A4582: 0x45

p

b

0x003A4583: 0x003A458B

p

p

0x003A4587: 0x003A4582

p

q

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 32: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exemplo

int main() {

char c = `A';

char b = `E';

char **p, *q;

p = &q;

q = &c;

p++;

q++;

printf("%c\n", *q);

printf("%c\n", **p);

return 0;

}

0x003A4581: 0x41

p

0x003A4582: 0x45

p

0x003A4583: 0x003A458B

p

0x003A4587: 0x003A4582

p

0x003A458B: 0x4B432BC8

p⇒

ESegmentation Fault.

Aula 16. Ponteiros II

Page 33: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Alocação de Memória

int main() {

char* str1, str2, str3;

str1 = "Hello World";

str2 = "Hello";

scanf("%s", str3);

return 0;

}

0x003A4581: 0x003A4632 str1

0x003A4585: 0x003A4940 str2

0x003A4589: 0x254AC570 str3

0x003A4632: "Hello World"

p

0x003A4940: "Hello"

p

0x003A5021: ???

p

Segmentation Fault.

Aula 16. Ponteiros II

Page 34: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Alocação de Memória

int main() {

char* str1, str2, str3;

str1 = "Hello World";

str2 = "Hello";

scanf("%s", str3);

return 0;

}

0x003A4581: 0x003A4632 str1

0x003A4585: 0x003A4940 str2

0x003A4589: 0x254AC570 str3

0x003A4632: "Hello World"

p

0x003A4940: "Hello"

p

0x003A5021: ???

p

Segmentation Fault.

Aula 16. Ponteiros II

Page 35: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Alocação de Memória

int main() {

char* str1, str2, str3;

str1 = "Hello World";

str2 = "Hello";

str3 = (char*) malloc(3);

scanf("%s", str3);

return 0;

}

0x003A4581: 0x003A4632 str1

0x003A4585: 0x003A4940 str2

0x003A4589: 0x003A5021 str3

0x003A4632: "Hello World"

p

0x003A4940: "Hello"

p

0x003A5021: "Ola"

p

Segmentation Fault.

Aula 16. Ponteiros II

Page 36: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Alocação de Memória

int main() {

char* str1, str2, str3;

str1 = "Hello World";

str2 = "Hello";

str3 = (char*) malloc(3);

scanf("%s", str3);

free(str3);

return 0;

}

0x003A4581: 0x003A4632 str1

0x003A4585: 0x003A4940 str2

0x003A4589: 0x003A5021 str3

0x003A4632: "Hello World"

p

0x003A4940: "Hello"

p

0x003A5021: "Ola"

p

Segmentation Fault.

Aula 16. Ponteiros II

Page 37: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Alocação de Memória

malloc(): aloca uma região de memória. Ele retorna um endereço

para aquela região e tem como argumento o tamanho da região a

ser alocada em bytes.

variavel = (tipo) malloc(tamanho);

Aula 16. Ponteiros II

Page 38: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Alocação de Memória

free(): desaloca uma região de memória, liberando espaço na

memória. Precisa somente do endereço da posição de memória.

free(variavel);

Aula 16. Ponteiros II

Page 39: Programação de Computadores IIsimone/progII/contaulas/aula16.pdf · Programação de Computadores II Aula 16. Ponteiros II Slides cedidos por Karina Mochetti 201 8.1 Aula 16. Ponteiros

Exercício

Faça um programa que:

leia um valor n

aloque na memória n inteiros

desaloque a memória

Aula 16. Ponteiros II