Escola Secundária c/ 3º CEB da Batalha
Estruturas
Linguagem C
Estruturas
• Struct são colecções de dados heterogêneos
agrupados em uma mesma estrutura de
dados
• Ex:
armazenas as coordenadas (x,y) de um ponto:
(x, y)
Linguagem C
TTipos Complexos
•Tipos básicos: char, int, float, etc.
Variáveis guardam um só valor.
•Matrizes: v.g. char matriz[20]
Variáveis guardam colecções de objectos
do mesmo tipo.

Como guardar colecções de tipos diversos?
Linguagem C
Solução: Estruturas
• Declaração:
struct {
int x;
int y;
} p1, p2;
(x, y)
• a estrutura contém dois inteiros, x e y
• p1 e p2 são duas variáveis tipo struct
contendo duas coordenadas cada.
Linguagem C
Estruturas
Exemplo:
struct {
char nome[NOME_MAX + 1];
int numero;
double media;
} aluno1, aluno2;
• Informação diversa sobre uma única entidade (um
aluno).
• Podem conter matrizes (e vice-versa).
• Podem conter outras estruturas.
Linguagem C
Declaração
• Formato da declaração:
struct nome_da_estrutura {
tipo_1 dado_1;
tipo_2 dado_2;
...
tipo_n dado_n;
} lista_de_variaveis;
• A estrutura pode agrupar um número arbitrário de
dados de tipos diferentes
• Pode nomear-se a estrutura para referenciá-la
Linguagem C
Definição de Tipos
struct {
int x;
int y;
} p1;
• struct
Repetição
struct {
int x;
int y;
} p2;
ponto define um novo tipo de dado
struct ponto {
int x;
int y;
};
struct ponto p1, p2;
• Pode definir-se novas variáveis do tipo ponto
Linguagem C
Definição de Tipos (declaração de variáveis)
struct Aluno {
Novo tipo:
struct Aluno
char nome[NOME_MAX + 1];
int numero;
 Definição de variáveis:
struct Aluno aluno1,
double media;
aluno2,*p, lista[10];
};
Equivalente a:
struct {
char nome[NOME_MAX + 1];
int numero;
double media;
}aluno1,aluno2,*p,
lista[10];
Linguagem C
Inicialização
struct Aluno {
char nome[NOME_MAX + 1];
int numero;
double media;};
struct Aluno aluno = {"Zacarias", 666, 20.0};
aluno
nome:
numero:
media:
Linguagem C
Acesso aos dados
struct-var.campo
Exemplo:
aluno1.nome = “Pedro”;/*atribuição */
aluno2.nome = “João;
if ((aluno1.nome == aluno2.nome) &&
(aluno1.media >= aluno2.media))
...
Linguagem C
Inicialização de estruturas
struct Aluno {
char nome[NOME_MAX + 1];
int numero;
double media;};
struct Aluno
aluno = {"Zacarias", 666,
20.0};
Equivalente a:
struct Aluno aluno;
strcpy(aluno.nome,"Zacarias
);
aluno.numero = 666;
aluno.media = 20.0;
aluno
nome: Z a ca r i as
numero: 666
media:
20.0
Linguagem C
Atribuição de Estruturas
Revisão:
• Inicialização de uma estrutura:
struct ponto p1 = { 220, 110 };
• Atribuição entre estruturas do mesmo tipo:
struct ponto p1 = { 220, 110 };
struct ponto p2;
p2 = p1; /* p2.x = p1.x e p2.y = p1.y */
• Os campos correspondentes das estruturas são
automaticamente copiados do destino para a origem
p1
x:
y:
220
110
p2
x:
y:
p2 = p1
p2
x:
y:
220
110
Linguagem C
Atribuição de Estruturas
• Atenção para estruturas que contenham ponteiros:
struct aluno {
char *nome;
int idade;
} a1, a2;
a1.nome = “Afranio”;
a1.idade = 32;
a2 = a1;
• Agora a1 e a2 apontam para a mesma string nome:
a1.nome == a2.nome == “Afranio”
Linguagem C
Composição de Estruturas
struct rectangulo {
struct ponto inicio;
struct ponto fim;
};
struct rectangulo r = { { 10, 20
},
{ 30 , 40 }
};
• Acesso aos dados:
r.inicio.x += 10;
r.inicio.y -= 10;
r
inicio
x: 10
y: 20
fim
x:
y:
30
40
Linguagem C
Estruturas como parâmetros
struct ponto cria_ponto (int x, int y) {
struct ponto tmp;
tmp.x = x;
tmp.y = y;
return tmp;
p
x:
y:
10
20
}
main () {
p
struct ponto p = cria_ponto(10, 20); x:
y:
}
Linguagem C
Operações
Operações entre membros das estruturas devem
ser feitas membro a membro:
/* retorna uma cópia de p1 = p1 + p2 */
struct soma_pts (struct ponto p1, struct ponto p2)
{
p1.x += p2.x; (relembro que p1.x = p1.x +p2.x)
p1.y += p2.y;
return p1;
}
/* retorna uma copia de p1 */
Linguagem C
Arrays de Estruturas
struct ponto arp[10];
/* cria um array de 10 pontos */
arp[1].x = 5;
/*atribui 5 a coordenada x do 2º ponto */
struct jogador {
char *nome;
int idade;
};
struct jogador PT[4] = {“Figo”,32,
“Carlos”, 24,
“Rui Costa”,27
...};
PT
nome:
idade:
nome:
idade:
Figo
32
Carlos
24
nome: Rui Costa
idade: 27
nome:
idade:
...
...
Linguagem C
Ponteiros para Estruturas
Estruturas grandes são passadas como parâmetros
p1
de forma mais eficiente através de ponteiros
x:
y:
10
20
struct ponto *pp;
pp
1002
struct ponto p1 = { 10, 20 };
1002
pp = &p1;
printf(“Ponto P1: (%d %d)\n”, (*pp).x, (*pp).y};
• Aceder com o operador “->”:
printf(“Ponto P1: (%d %d)\n”, pp->x, pp->y};
(*pp).x == pp->x
Linguagem C
Espaço Alocado para uma Estrutura
struct aluno {
char *nome;
short idade;
char matricula[8];
};
/* ponteiro 4 bytes */
/* 2 bytes */
/* array 8 bytes */
struct aluno al
*
struct aluno al;
30
al.nome = “Xexeo”;
“00/0000”
al.idade = 30;
strcpy(al.matricula, “00/0001”);
“Xexeo”
Linguagem C
Função sizeof(tipo)
• A função sizeof(tipo) retorna o tamanho em
bytes ocupado na memória pelo tipo de dado
passado como parâmetro
Ex:
sizeof(int)
sizeof(char)
sizeof(struct ponto)
sizeof(struct ponto *)
=>
=>
=>
=>
4
1
8
4
bytes
byte
bytes
bytes
Linguagem C
Espaço Efectivo
/* teste com Symantec C, PowerPC 603 - Macintosh */
struct aluno {
char *nome;
/* 4
short idade;
/* 2
char matricula[3];
/* 3
};
/* sizeof(aluno)
bytes */
bytes */
bytes */
= 12 bytes */
Linguagem C
Espaço Efectivo
/* teste com Symantec C, PowerPC 603 - Macintosh */
struct aluno1 {
char *nome;
short idade;
char matricula[5];
};
/* 4 bytes */
/* 2 bytes */
/* 5 bytes */
/* sizeof(aluno1) = 12 bytes */
Linguagem C
Espaço Efectivo
/* teste com Symantec C, PowerPC 603 - Macintosh */
struct aluno2 {
char *nome;
/* 4 bytes
short idade;
/* 2 bytes
char matricula[7];
/* 7 bytes
};
/* sizeof(aluno2) = 16
*/
*/
*/
bytes */
• no PowerMac uma estrutura é um múltiplo do tamanho
da palavra, 32 bits
Linguagem C
Download

Estruturas