Escolar Documentos
Profissional Documentos
Cultura Documentos
2
Memória Leia mais
? sobre Heap e
Stack
● Esquema didático da distribuição da memória
Código do programa
Memória
Variáveis globais
Heap #00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
(Alocação dinâmica)
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
representação da
Pilha memória que nós
utilizaremos nesta aula
(Alocação estática)
3
Memória
Alocação Estática
O tamanho do espaço é definido durante
a codificação (tempo de compilação)
variáveis variáveis
locais globais
4
Conceitos de ponteiros da aula anterior...
● Manipulação de ponteiros
● Operador &
● Operador * Representação simplificada
w p1 i1
Código #08 #00 15
Escreva o código #16 #08 #00
correspondente a
organização ilustrada
ao lado Memória
i1 p1
15 #00
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
w
#08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
5
Conceitos de ponteiros da aula anterior...
● Manipulação de ponteiros
● Operador &
● Operador * Representação simplificada
w p1 i1
Código #08 #00 15
short int i1 = 15; #16 #08 #00
w
#08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
6
Conceitos de ponteiros da aula anterior...
● Manipulação de ponteiros
● Operador &
● Operador * Representação simplificada
A partir desse código,
descreva todas as formas
em que podemos acessar a
w p1 i1
Código região de memória em que
#08 #00 15 o inteiro 15 está
short int i1 = 15; #16 #08 #00 armazenado.
w
#08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
7
Conceitos de ponteiros da aula anterior...
● Manipulação de ponteiros
● Operador &
● Operador * Representação simplificada
Diferentes formas de se
obter o inteiro 15
w p1 i1 i1
Código #08 #00 15 *p1
short int i1 = 15; #16 #08 #00 **w
w
#08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
8
Vetor (Array unidimensional)
Funcionamento básico
Um arranjo (em inglês array) é uma estrutura de dados que armazena uma
coleção de elementos de tal forma que cada um dos elementos possa ser
identificado por, pelo menos, um índice ou uma chave.
9
Vetor (Array unidimensional)
Organização dos dados
v2
5 6
#08 #12
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
10
Vetor (Array unidimensional)
Organização dos dados
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
11
Vetor (Array unidimensional) Como é possível descobrir o
Organização dos dados endereço que cada posição
ocupa na memória?
Organização de um vetor na memória
Código Representação simplificada v1[2]
short int v1[3]={7,8,9}; v1
int v2[2] = {5,6}; 7 8 9
#00 #02 #04
v2
5 6
#08 #12
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
12
Vetor (Array unidimensional) Como é possível descobrir o
Organização dos dados endereço que cada posição
ocupa na memória?
Organização de um vetor na memória
v1[2]
Código Representação simplificada
Duas posições depois do
short int v1[3]={7,8,9}; v1 endereço inicial que o vetor foi
int v2[2] = {5,6}; 7 8 9 alocado
#00 #02 #04
v2
5 6
#08 #12
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
13
Vetor (Array unidimensional) Como é possível descobrir o
Organização dos dados endereço que cada posição
ocupa na memória?
Organização de um vetor na memória
v1[2]
Código Representação simplificada
Duas posições depois do
short int v1[3]={7,8,9}; v1 endereço inicial que o vetor foi
int v2[2] = {5,6}; 7 8 9 alocado
#00 #02 #04
End. inicial + (posição * tam do tipo)
v2
5 6
#08 #12
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
14
Vetor (Array unidimensional) Como é possível descobrir o
Organização dos dados endereço que cada posição
ocupa na memória?
Organização de um vetor na memória
v1[2]
Código Representação simplificada
Duas posições depois do
short int v1[3]={7,8,9}; v1 endereço inicial que o vetor foi
int v2[2] = {5,6}; 7 8 9 alocado
#00 #02 #04
End. inicial + (posição * tam do tipo)
v2
#00 + (2 * (tam do tipo))
5 6 #00 + (2 * (2))
#08 #12 #00 + 4
#04
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
15
Vetor (Array unidimensional) Como é possível descobrir o
Organização dos dados endereço que cada posição
ocupa na memória?
Organização de um vetor na memória
v2[1]
Código Representação simplificada
Uma posição depois do endereço
short int v1[3]={7,8,9}; v1 inicial que o vetor foi alocado
int v2[2] = {5,6}; 7 8 9
#00 #02 #04
End. inicial + (posição * tam do tipo)
v2
5 6
#08 #12
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
16
Vetor (Array unidimensional) Como é possível descobrir o
Organização dos dados endereço que cada posição
ocupa na memória?
Organização de um vetor na memória
v2[1]
Código Representação simplificada
Uma posição depois do endereço
short int v1[3]={7,8,9}; v1 inicial que o vetor foi alocado
int v2[2] = {5,6}; 7 8 9
#00 #02 #04
End. inicial + (posição * tam do tipo)
v2
#08 + (1 * (tam do tipo))
5 6 #08 + (1 * (4))
#08 #12 #08 + 4
#12
Memória
v1 v2
7 8 9 5 6
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
17
Existe uma equivalência
Vetor (Array unidimensional) semântica entre vetores e
Relação com os ponteiros ponteiros
p1 p2
#00 #08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
18
Existe uma equivalência
Vetor (Array unidimensional) semântica entre vetores e
Relação com os ponteiros ponteiros
p1 p2
#00 #08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
19
Existe uma equivalência
Vetor (Array unidimensional) semântica entre vetores e
Relação com os ponteiros ponteiros
p1 p2
#00 #08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
20
Existe uma equivalência
Vetor (Array unidimensional) semântica entre vetores e
Relação com os ponteiros ponteiros
p1 p2
#00 #08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
21
Existe uma equivalência
Vetor (Array unidimensional) semântica entre vetores e
Relação com os ponteiros ponteiros
p1 p2
#00 #08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
22
Existe uma equivalência
Vetor (Array unidimensional) semântica entre vetores e
Relação com os ponteiros ponteiros
p1 p2
#00 #08
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
23
Código Representação simplificada
Praticando pi i
Memória
i pi
200 #16
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
v
10 20 30 40
#32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47
p x
#32 #40
#48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63
24
Código Representação simplificada
Praticando int i = 200;
pi i
Memória
i pi
200 #16
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
v
10 20 30 40
#32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47
p x
#32 #40
#48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63
25
Código Representação simplificada
Praticando int i = 200;
pi i
v
10 20 30 40
e) Quais são as formas #32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47
v
10 20 30 40
e) Quais são as formas #32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47
v
10 20 30 40
e) Quais são as formas #32 #33 #34 #35 #36 #37 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47
x[1] *(x+1) 30
Matriz (Array bidimensional) #00
#04
10
30
20
40
#02
#06
Organização de uma matriz na memória e sua relação com ponteiros #08 50 60 #10
p1 p2
#00 #04
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
31
Matriz (Array bidimensional) #00
#04
10
30
20
40
#02
#06
Organização de uma matriz na memória e sua relação com ponteiros #08 50 60 #10
#04
10
30
20
40
#02
#06
Organização de uma matriz na memória e sua relação com ponteiros #08 50 60 #10
34
Estrutura Heterogênea Os valores da estrutura são
armazenados em sequência na
memória.
a2.ra = 101;
strcpy(a2.nome, "Jose");
a2.notas[0] = 6.2;
...
O operador ponto (.) conecta o nome de uma variável de estrutura a um membro dela.
36
Estrutura Heterogênea
Código Representação simplificada
typedef struct {
ra nome notas
unsigned int ra;
char nome[12]; a1 100 Joao\0 6.5 8.2 7.3
float notas[3]; #20 #24 #36 #40 #44
} Aluno;
ra nome notas
Aluno a1; a2 101 Jose\0 6.2 5.3 7.8
a1.ra = 100; #48 #52 #64 #68 #72
strcpy(a1.nome, "Joao");
a1.notas[0] = 6.5;
...
Aluno a2;
a2.ra = 101;
strcpy(a2.nome, "Jose");
a2.notas[0] = 6.2;
Estrutura Código
typedef struct { int main(){
unsigned int ra; Aluno alunos[10];
char nome[12];
float notas[3]; alunos[0].ra = 100;
} Aluno; strcpy(alunos[0].nome, "Joao");
alunos[0].notas[0] = 6.5;
printf("%s\n", alunos[0].nome);
}
38
Estrutura Heterogênea
Aninhamento de Estruturas
Estrutura Código
typedef struct { int main(){
int dia; // exemplo de declaração
char mes[10]; Aluno a1={100, "Joao", {6.5, 8.2, 7.3}, {23, "Maio", 2021}};
int ano;
} Data; // exemplo de uso:
printf("Ano de ingresso: %d", a1.ingresso.ano);
typedef struct {
unsigned int ra; return 0;
char nome[12]; }
float notas[3];
Data ingresso;
} Aluno;
39
Estrutura Heterogênea
Ponteiros
Código Representação simplificada
typedef struct {
v
unsigned int ra;
char nome[12]; #36
float notas[3]; #88
} Aluno;
p a1 ra nome notas
Aluno a1;
Aluno *p = &a1; #20 100 Joao\0 6.5 8.2 7.3
#80 #20 #24 #36 #40 #44
(*p).ra = 100;
strcpy((*p).nome, "Joao");
(*p).notas[0] = 6.5;
float *v = (*p).notas;
v[1] = 8.2;
*(v+2) = 7.3;
40
Estrutura Heterogênea
Ponteiros + Açúcar Sintático
Código Representação simplificada
typedef struct {
v
unsigned int ra;
char nome[12]; #36
float notas[3]; #88
} Aluno;
p a1 ra nome notas
Aluno a1;
Aluno *p = &a1; #20 100 Joao\0 6.5 8.2 7.3
#80 #20 #24 #36 #40 #44
p->ra = 100;
strcpy(p->nome, "Joao");
p->notas[0] = 6.5;
float *v = p->notas;
v[1] = 8.2;
*(v+2) = 7.3;
41
Estrutura Heterogênea
Resumo das formas de acesso
42
Estrutura Heterogênea
Exercício
Representação simplificada
v
#36
Quais as diferentes formas de acesso ao
? endereço #40 ?
#88
p a1 ra nome notas
#20 100 Joao\0 6.5 7.1 7.3
#80 #20 #24 #36 #40 #44
43
Estrutura Heterogênea
Resposta:
Representação simplificada
v
#36
#88
p a1 ra nome notas
#20 100 Joao\0 6.5 7.1 7.3
#80 #20 #24 #36 #40 #44
44
45