Você está na página 1de 45

02

Mestrado em Ciência da Computação


Estrutura de Dados

Memória, Tipos Compostos e Ponteiros


Organização dos Tipos Compostos na memória e sua relação com Ponteiros

Material gentilmente oferecido pelo Prof. Rafael Liberato

André Luis Schwerz


1
andreluis@utfpr.edu.br
Agenda Objetivos
● Memória Representar a organização dos dados
de arrays unidimensionais e X
● Tipos construídos
○ Vetor bidimensionais na memória
○ Matriz
Representar a organização de uma
○ Struct
estrutura heterogênea na memória X
Manipular corretamente os dados dos
tipos construídos por meio de X
ponteiros

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)

Não precisamos nos preocupar com o


gerenciamento do espaço alocado. A
vida útil do espaço é definido pelo
escopo em que a variável foi declarada

Escopo local ou global

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

short int *p1;


short int **w; Memória
i1 p1
p1 = &i1;
w = &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

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.

short int *p1;


short int **w; Memória
i1 p1
p1 = &i1;
w = &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

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

short int *p1;


short int **w; Memória
i1 p1
p1 = &i1;
w = &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

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.

Declaração Manipulação Representação

int v[3]; v[0] = 10; v


v[1] = 20; 10 20 30
v[2] = 30; 0 1 2

Usamos os colchetes para


acessar uma posição
específica da estrutura.

Como é possível descobrir o endereço que cada


posição ocupa na memória?

9
Vetor (Array unidimensional)
Organização dos dados

Organização de um vetor na memória


Código Representação simplificada
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
10
Vetor (Array unidimensional)
Organização dos dados

Organização de um vetor na memória


Código Representação simplificada
short int v1[3]={7,8,9}; v1
int v2[2] = {5,6}; 7 8 9
#00 #02 #04
printf("%p\n",v1); v2
printf("%p\n",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
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

Organização de um vetor na memória


Qual é o resultado da
Código Representação simplificada impressão abaixo:

short int v1[3]={7,8,9}; p1 v1 printf("%p",v1);


int v2[2] = {5,6}; #00 7 8 9
#16 #00 #02 #04
short int *p1; p2 v2
int *p2; #08 5 6
#24 #08 #12
p1 = v1;
p2 = v2;
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

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

Organização de um vetor na memória


Qual é o resultado da
Código Representação simplificada impressão abaixo:

short int v1[3]={7,8,9}; p1 v1 printf("%p",v1);


int v2[2] = {5,6}; #00 7 8 9 #00
#16 #00 #02 #04
short int *p1; p2 v2 A variável alocada para o
int *p2; #08 5 6 vetor também se comporta
#24 #08 #12 como um ponteiro.
p1 = v1;
p2 = v2;
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

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

Organização de um vetor na memória


Código Representação simplificada Podemos acessar os
valores do vetor v1 por
short int v1[3]={7,8,9}; p1 v1 meio do ponteiro p1 usando
int v2[2] = {5,6}; #00 7 8 9 os colchetes.
#16 #00 #02 #04
short int *p1; p2 v2 printf("%d",p1[0]);
int *p2; #08 5 6
#24 #08 #12
p1 = v1;
p2 = v2;
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

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

Organização de um vetor na memória


Código Representação simplificada Também podemos acessar
p1 v1
os valores do vetor v1
short int v1[3]={7,8,9};
como se fosse um ponteiro.
int v2[2] = {5,6}; #00 7 8 9
#16 #00 #02 #04
short int *p1; p2 v2 printf("%d",*(v1+0));
int *p2; #08 5 6
#24 #08 #12
p1 = v1;
p2 = v2;
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

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

Organização de um vetor na memória


Código Representação simplificada Quais são as diferentes formas
de acessar o valor inteiro 9 no
short int v1[3]={7,8,9}; p1 v1
endereço #04 ?
int v2[2] = {5,6}; #00 7 8 9
#16 #00 #02 #04
short int *p1;
int *p2;
p2
#08
v2
5 6
?
#24 #08 #12
p1 = v1;
p2 = v2;
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

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

Organização de um vetor na memória


Código Representação simplificada Quais são as diferentes formas
de acessar o valor inteiro 9 no
short int v1[3]={7,8,9}; p1 v1
endereço #04 ?
int v2[2] = {5,6}; #00 7 8 9
#16 #00 #02 #04
v1[2] *(v1+2)
short int *p1; p2 v2
int *p2; p1[2] *(p1+2)
#08 5 6
#24 #08 #12
p1 = v1;
p2 = v2;
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

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

parte 1 #16 200


x
#20 #16
#40
#56
a) Escreva o código
correspondente ao desenho. p v
#32 10 20 30 40
#48 #32 #36 #40 #44

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

parte 1 int* pi = &i;


#16 200
x
Resposta #20 #16
#40
int v[4]={10,20,30,40}; #56
a) Escreva o código int* p = v;
correspondente ao desenho. int* x = v + 2;
p v
#32 10 20 30 40
#48 #32 #36 #40 #44

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

parte 2 int* pi = &i;


#16 200
x
#20 #16
#40
b) Quais são as formas int v[4]={10,20,30,40}; #56
int* p = v;
possíveis de acessar o inteiro
int* x = v + 2;
200 no endereço #16? p v
#32 10 20 30 40
c) Quais são as formas #48 #32 #36 #40 #44

possíveis de acessar o inteiro


10 no endereço #32? Memória

d) Quais são as formas i pi


possíveis de acessar o inteiro 200 #16
30 no endereço #40? #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31

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

possíveis de acessar o inteiro p x


40 no endereço #44? #32 #40
#48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63
26
Código Representação simplificada
Praticando int i = 200;
pi i

parte 2 int* pi = &i;


#16 200
x
Resposta #20 #16
#40
b) Quais são as formas int v[4]={10,20,30,40}; #56
int* p = v;
possíveis de acessar o inteiro
int* x = v + 2;
200 no endereço #16? p v
i *pi #32 10 20 30 40
c) Quais são as formas #48 #32 #36 #40 #44

possíveis de acessar o inteiro


10 no endereço #32? Memória

d) Quais são as formas i pi


possíveis de acessar o inteiro 200 #16
30 no endereço #40? #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31

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

possíveis de acessar o inteiro p x


40 no endereço #44? #32 #40
#48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63
27
Código Representação simplificada
Praticando int i = 200;
pi i

parte 2 int* pi = &i;


#16 200
x
Resposta #20 #16
#40
b) Quais são as formas int v[4]={10,20,30,40}; #56
int* p = v;
possíveis de acessar o inteiro
int* x = v + 2;
200 no endereço #16? p v
i *pi #32 10 20 30 40
c) Quais são as formas #48 #32 #36 #40 #44

possíveis de acessar o inteiro


10 no endereço #32? Memória
v[0] p[0] *v *p
d) Quais são as formas i pi
possíveis de acessar o inteiro 200 #16
30 no endereço #40? #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31

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

possíveis de acessar o inteiro p x


40 no endereço #44? #32 #40
#48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63
28
Código Representação simplificada
Praticando int i = 200;
pi i

parte 2 int* pi = &i;


#16 200
x
Resposta #20 #16
#40
b) Quais são as formas int v[4]={10,20,30,40}; #56
int* p = v;
possíveis de acessar o inteiro
int* x = v + 2;
200 no endereço #16? p v
i *pi #32 10 20 30 40
c) Quais são as formas #48 #32 #36 #40 #44

possíveis de acessar o inteiro


10 no endereço #32? Memória
v[0] p[0] *v *p
d) Quais são as formas i pi
possíveis de acessar o inteiro 200 #16
30 no endereço #40? #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31

v[2] p[2] *(v+2) *(p+2) v


x[0] *x
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

possíveis de acessar o inteiro p x


40 no endereço #44? #32 #40
#48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63
29
Código Representação simplificada
Praticando int i = 200;
pi i

parte 2 int* pi = &i;


#16 200
x
Resposta #20 #16
#40
b) Quais são as formas int v[4]={10,20,30,40}; #56
int* p = v;
possíveis de acessar o inteiro
int* x = v + 2;
200 no endereço #16? p v
i *pi #32 10 20 30 40
c) Quais são as formas #48 #32 #36 #40 #44

possíveis de acessar o inteiro


10 no endereço #32? Memória
v[0] p[0] *v *p
d) Quais são as formas i pi
possíveis de acessar o inteiro 200 #16
30 no endereço #40? #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31

v[2] p[2] *(v+2) *(p+2) v


x[0] *x
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

possíveis de acessar o inteiro p x


40 no endereço #44? #32 #40
v[3] p[3] *(v+3) *(p+3) #48 #49 #50 #51 #52 #53 #54 #55 #56 #57 #58 #59 #60 #61 #62 #63

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

Código Representação simplificada


short int m[3][2]={ p2
{10,20}, #04
{30,40},
p1 m #24
{50,60}};
#00 10 20 30 40 50 60
short int* p1 = (short int*) m; #16 #00 #02 #04 #06 #08 #10
short int* p2 = m[1];

Como acessar as células da Memória


matriz por meio do ponteiro
m
p1? Por exemplo, linha 2,
10 20 30 40 50 60
coluna 1. m[2][1] #00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15

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

Código Representação simplificada


short int m[3][2]={ p2
{10,20}, #04
{30,40},
p1 m #24
{50,60}};
#00 10 20 30 40 50 60
short int* p1 = (short int*) m; #16 #00 #02 #04 #06 #08 #10
short int* p2 = m[1];

Como acessar as células da Memória


matriz por meio do ponteiro
m
p1? Por exemplo, linha 2,
10 20 30 40 50 60
coluna 1. m[2][1] #00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15

* ( p1 + (linha* qtd_colunas) + coluna) p1 p2


* ( p1 + (2 * 2 ) + 1)
#00 #04
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
32
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

Código Representação simplificada


short int m[3][2]={ p2
{10,20}, #04
{30,40},
p1 m #24
{50,60}};
#00 10 20 30 40 50 60
short int* p1 = (short int*) m; #16 #00 #02 #04 #06 #08 #10
short int* p2 = m[1];

Como acessar as células da Memória


matriz por meio do ponteiro
m
p1? Por exemplo, linha 2,
10 20 30 40 50 60
coluna 1. m[2][1] #00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #10 #11 #12 #13 #14 #15

* ( p1 + (linha* qtd_colunas) + coluna) p1 p2


* ( p1 + (2 * 2 ) + 1)
#00 #04
* ( #00 + 4 + 1)
#16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31
* ( #10 )
33
60
Estrutura Heterogênea
Uma estrutura de dados heterogênea é um tipo de dados construído que agrupa
itens de dados de diferentes tipos.

A definição de uma estrutura não cria uma


variável
Código A definição de uma estrutura informa ao compilador o
nome, o tamanho em bytes e a maneira como ela
struct Aluno{
unsigned int ra; deve ser armazenada e recuperada da memória.
char nome[12];
Não reserva memória.
float notas[3];
};
A estrutura é um tipo de dado cujo formato é
definido pelo programador.

34
Estrutura Heterogênea Os valores da estrutura são
armazenados em sequência na
memória.

Código Representação simplificada


struct Aluno{
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
};
ra nome notas
a2 100 Joao\0 6.5 8.2 7.3
struct Aluno a1 = {100, "Joao", {6.5, 8.2, 7.3}}; #48 #52 #64 #68 #72
struct Aluno a2;
a2 = a1;

A inicialização é semelhante a inicialização das matrizes.


As variáveis são inicializadas juntamente com suas declarações.
Os valores atribuídos aos membros devem ser colocados na ordem da definição separados por
vírgula e entre chaves.
Uma variável estrutura pode ser atribuída à outra variável do mesmo tipo por meio de uma
atribuição simples.
35
Estrutura Heterogênea

Código Representação simplificada


struct Aluno{
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
}a1, a2;
ra nome notas
a1.ra = 100; a2 101 Jose\0 6.2 5.3 7.8
strcpy(a1.nome, "Joao"); #48 #52 #64 #68 #72
a2.notas[0] = 6.5;
...

a2.ra = 101;
strcpy(a2.nome, "Jose");
a2.notas[0] = 6.2;
...

Declaração alternativa com múltiplas variáveis.

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;

O comando typedef define um apelido (alias) para um tipo.

Apelidos simplificam o uso de estruturas em C.

Omitimos a palavra struct ao declarar variáveis.


37
Estrutura Heterogênea
Arrays de Estruturas

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

Você também pode gostar