Estruturas e unies
() Elementos de programao em C 1 / 36
Sumrio
1 Declarao de estruturas
2 Referenciando os componentes
4 Vetores de estruturas
5 Iniciando estruturas
6 Declarao de unies
7 Referenciando os componentes
8 () Elementos de programao em C 2 / 36
Declarao de estruturas
Declarao de estruturas
As estruturas so declaradas atravs de variveis do tipo estrutura que
especifica os seus componentes.
() Elementos de programao em C 3 / 36
Declarao de estruturas
Declarao de estruturas
As estruturas so declaradas atravs de variveis do tipo estrutura que
especifica os seus componentes.
Exemplo
Para o tipo estrutura ao lado as struct {
seguintes declaraes so int matr ;
possveis: float nota1 ;
float nota2 ;
}
() Elementos de programao em C 3 / 36
Referenciando os componentes
() Elementos de programao em C 4 / 36
Referenciando os componentes
Exemplo
aluno.nota1 Componente nota1 da estrutura armazenada em aluno.
aluno.matr Componente matr da mesma estrutura.
() Elementos de programao em C 4 / 36
Referenciando os componentes
() Elementos de programao em C 5 / 36
Referenciando os componentes
Exemplo
ptr_aluno->nota1 Componente nota1 da estrutura apontada
por ptr_aluno.
ptr_aluno->matr Componente matr da mesma estrutura.
() Elementos de programao em C 5 / 36
Referenciando os componentes
Exemplo
O programa ao lado l # include < stdio .h >
os dados de um aluno, struct r_aluno {
armazenando-os em int matr ;
float nota1 ;
uma estrutura e float nota2 ;
imprimindo-os em };
struct r_aluno ler_aluno ( void );
seguida. void imp_aluno ( struct r_aluno );
int main ( void ) {
struct r_aluno aluno = ler_aluno ();
imp_aluno ( aluno );
return 0;
}
continua...
() Elementos de programao em C 6 / 36
Referenciando os componentes
() Elementos de programao em C 7 / 36
Referenciando os componentes
Exemplo
O programa ao lado # include < stdio .h >
modifica o exemplo struct r_aluno {
anterior, usando um int matr ;
float nota1 ;
ponteiro para a float nota2 ;
estrutura aluno. };
void ler_aluno ( struct r_aluno *);
void imp_aluno ( struct r_aluno *);
int main ( void ) {
struct r_aluno aluno ;
ler_aluno (& aluno );
imp_aluno (& aluno );
return 0;
}
continua...
() Elementos de programao em C 8 / 36
Referenciando os componentes
Exemplo
...continuao
void ler_aluno ( struct r_aluno * al ) {
printf (" Digite os dados do aluno \ n ");
printf (" Matricula : ");
scanf ("% d " , & al - > matr );
printf (" Primeira nota : ");
scanf ("% f " , & al - > nota1 );
printf (" Segunda nota : ");
scanf ("% f " , & al - > nota2 );
}
void imp_aluno ( struct r_aluno * al ) {
printf (" Matr : % d Notas : %5.2 f %5.2 f " ,
al - > matr , al - > nota1 , al - > nota2 );
printf (" Media : %5.2 f \ n " ,
( al - > nota1 + al - > nota2 ) / 2);
}
() Elementos de programao em C 9 / 36
Referenciando os componentes
() Elementos de programao em C 10 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
&(*al)
al->nota1
(*al).nota1
(&(*al))->nota1
&(*al).nota1
&((*al).nota1).
*al.nota1
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
&(*al).nota1
&((*al).nota1).
*al.nota1
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
&(*al).nota1
&((*al).nota1).
*al.nota1
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
&(*al).nota1
&((*al).nota1).
*al.nota1
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
() Elementos de programao em C 11 / 36
Referenciando os componentes
Exemplo
Considerando que al um ponteiro para a estrutura aluno dos exemplos
anteriores, o que representam as expresses a seguir?
() Elementos de programao em C 11 / 36
Estruturas com componente flexvel
() Elementos de programao em C 12 / 36
Estruturas com componente flexvel
Exemplo
No programa ao lado # include < stdio .h >
a estrutura apontada # include < stdlib .h >
pela varivel reg_a struct r1 {
int matr ;
alocada com 4 int vendas_mes [];
elementos para o vetor };
int main ( void ) {
vendas_mes. struct r1 * reg_a ;
reg_a = ( struct r1 *) malloc (
sizeof ( struct r1 ) + sizeof ( int [4]));
for ( int i = 0; i < 4; i ++) {
printf ("% d \ n " , reg_a - > vendas_mes [ i ]);
}
return 0;
}
() Elementos de programao em C 13 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
struct { typedef struct {
int matr ; int matr ;
float nota1 ; float nota1 ;
float nota2 ; float nota2 ;
} v_alunos [20]; } tp_r_aluno ;
tp_r_aluno v_alunos [20];
() Elementos de programao em C 14 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo. O programa # include < stdio .h >
ao lado usa um vetor # define QTD_AL (10)
de estruturas para struct r_aluno {
int matr ;
armazenar (e float nota1 ;
imprimir) os dados de float nota2 ;
};
dez alunos. void imp_alunos ( struct r_aluno []);
int main ( void ) {
struct r_aluno v_alunos [ QTD_AL ];
printf (" Digite os dados dos % d alunos \ n " ,
QTD_AL );
for ( int i = 0; i < QTD_AL ; i ++) {
printf (" Matricula % d : " , ( i + 1));
scanf ("% d " , & v_alunos [ i ]. matr );
printf (" Primeira nota : ");
scanf ("% f " , & v_alunos [ i ]. nota1 );
printf (" Segunda nota : ");
scanf ("% f " , & v_alunos [ i ]. nota2 );
}
continua...
() Elementos de programao em C 15 / 36
Vetores de estruturas
Vetores de estruturas
() Elementos de programao em C 16 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Para o vetor v_alunos ao lado, o que struct r_aluno {
representam as seguintes expresses? int matr ;
float nota1 , nota2 ;
} v_alunos [1000];
v_alunos
*(v_alunos + 2)
&v_alunos[2]
v_alunos[2].matr
(*v_alunos).matr
() Elementos de programao em C 17 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Para o vetor v_alunos ao lado, o que struct r_aluno {
representam as seguintes expresses? int matr ;
float nota1 , nota2 ;
} v_alunos [1000];
&v_alunos[2]
v_alunos[2].matr
(*v_alunos).matr
() Elementos de programao em C 17 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Para o vetor v_alunos ao lado, o que struct r_aluno {
representam as seguintes expresses? int matr ;
float nota1 , nota2 ;
} v_alunos [1000];
v_alunos[2].matr
(*v_alunos).matr
() Elementos de programao em C 17 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Para o vetor v_alunos ao lado, o que struct r_aluno {
representam as seguintes expresses? int matr ;
float nota1 , nota2 ;
} v_alunos [1000];
v_alunos[2].matr
(*v_alunos).matr
() Elementos de programao em C 17 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Para o vetor v_alunos ao lado, o que struct r_aluno {
representam as seguintes expresses? int matr ;
float nota1 , nota2 ;
} v_alunos [1000];
() Elementos de programao em C 17 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Para o vetor v_alunos ao lado, o que struct r_aluno {
representam as seguintes expresses? int matr ;
float nota1 , nota2 ;
} v_alunos [1000];
Vetores de estruturas
Exemplo
Se pa aponta para o segundo elemento struct r_aluno {
do vetor ao lado, e sabendo que os int matr ;
operadores -> e . tm maior precedncia float nota1 , nota2 ;
} v_alunos [1000];
que ++, o que representam as seguintes
expresses?
pa++->matr
++pa->matr
++(pa->matr)
(++pa)->matr
() Elementos de programao em C 18 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Se pa aponta para o segundo elemento struct r_aluno {
do vetor ao lado, e sabendo que os int matr ;
operadores -> e . tm maior precedncia float nota1 , nota2 ;
} v_alunos [1000];
que ++, o que representam as seguintes
expresses?
++(pa->matr)
(++pa)->matr
() Elementos de programao em C 18 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Se pa aponta para o segundo elemento struct r_aluno {
do vetor ao lado, e sabendo que os int matr ;
operadores -> e . tm maior precedncia float nota1 , nota2 ;
} v_alunos [1000];
que ++, o que representam as seguintes
expresses?
(++pa)->matr
() Elementos de programao em C 18 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Se pa aponta para o segundo elemento struct r_aluno {
do vetor ao lado, e sabendo que os int matr ;
operadores -> e . tm maior precedncia float nota1 , nota2 ;
} v_alunos [1000];
que ++, o que representam as seguintes
expresses?
() Elementos de programao em C 18 / 36
Vetores de estruturas
Vetores de estruturas
Exemplo
Se pa aponta para o segundo elemento struct r_aluno {
do vetor ao lado, e sabendo que os int matr ;
operadores -> e . tm maior precedncia float nota1 , nota2 ;
} v_alunos [1000];
que ++, o que representam as seguintes
expresses?
() Elementos de programao em C 18 / 36
Iniciando estruturas
Iniciando estruturas
Exemplo
struct {
int matr ;
float nota1 ;
float nota2 ;
} aluno = {130518 , 4.57 , 8.33 , 9.54} ,
aluno_regular = {234 , 7.65};
() Elementos de programao em C 19 / 36
Iniciando estruturas
Exemplo
struct {
int matr ;
struct {
char sexo ;
int rg ;
} sit ;
float nota1 ;
float nota2 ;
} reg_a = {1111 , m , 715 , 8.54 , 5.73} ,
reg_b = {2222 , f } ,
reg_c = {. sit = { f , 32} , 215.3} ,
reg_d = {3333 , { m , 234} , 86.44};
() Elementos de programao em C 20 / 36
Iniciando estruturas
Exemplo
struct r_aula {
char topico [20];
int ini ;
int fim ;
} aula =
( struct r_aula ){" Programacao " , 10 , 12};
() Elementos de programao em C 21 / 36
Declarao de unies
Declarao de unies
() Elementos de programao em C 22 / 36
Declarao de unies
Declarao de unies
() Elementos de programao em C 22 / 36
Referenciando os componentes
() Elementos de programao em C 23 / 36
Referenciando os componentes
() Elementos de programao em C 24 / 36
Referenciando os componentes
Exemplo
Para a unio ao lado, aps a atribuio union u {
tst.num = 23, as expresses a seguir tm o int num ;
significado descrito: char texto [20];
} tst ;
() Elementos de programao em C 25 / 36
Referenciando os componentes
Exemplo
Em cada impresso # include < stdio .h >
do programa ao lado union r {
apenas um valor est float a ;
double b ;
corretamente int c ;
referenciado. } tst ;
int main ( void ) {
tst . a = 34.5;
printf ("% g % g % d \ n " , tst .a , tst .b , tst . c );
tst . b = 34.5;
printf ("% g % g % d \ n " , tst .a , tst .b , tst . c );
tst . c = 34.5;
printf ("% g % g % d \ n " , tst .a , tst .b , tst . c );
return 0;
}
() Elementos de programao em C 26 / 36
Unies como componentes de estruturas
() Elementos de programao em C 27 / 36
Unies como componentes de estruturas
() Elementos de programao em C 29 / 36
Unies como componentes de estruturas
() Elementos de programao em C 30 / 36
Iniciando unies
Iniciando unies
() Elementos de programao em C 31 / 36
Iniciando unies
Iniciando unies
Iniciao Corresponde a
union doc_id id = {1234}; id.regra = 1234;
union doc_id id = {t}; id.regra = t;
union doc_id id = {.norma = t}; id.norma = t;
() Elementos de programao em C 31 / 36
Campos de bits
Campos de bits
Define componentes de tipo inteiro com uma quantidade limitada de
bits.
O tipo de um campo de bits deve ser
_Bool,
signed int,
unsigned int, ou
algum outro tipo dependente da implementao.
O tipo int ser implementado como signed int ou unsigned int,
dependendo da implementao.
() Elementos de programao em C 32 / 36
Campos de bits
Campos de bits
Define componentes de tipo inteiro com uma quantidade limitada de
bits.
O tipo de um campo de bits deve ser
_Bool,
signed int,
unsigned int, ou
algum outro tipo dependente da implementao.
O tipo int ser implementado como signed int ou unsigned int,
dependendo da implementao.
Exemplo
A estrutura ao lado usa dois campos de struct r_arq {
bits. char id [9];
_Bool grv : 1;
unsigned int perm : 3;
}
() Elementos de programao em C 32 / 36
Campos de bits
Campos de bits
() Elementos de programao em C 33 / 36
Compatibilidade de estruturas e unies
() Elementos de programao em C 34 / 36
Compatibilidade de estruturas e unies
() Elementos de programao em C 35 / 36
Bibliografia
Bibliografia
ISO/IEC
C Programming Language Standard
ISO/IEC 9899:2011, International Organization for Standardization;
International Electrotechnical Commission, 3rd edition, WG14/N1570
Committee final draft, abril de 2011.
Francisco A. C. Pinheiro
Elementos de programao em C
Bookman, Porto Alegre, 2012.
www.bookman.com.br, www.facp.pro.br/livroc
() Elementos de programao em C 36 / 36