Aula 18: Estruturas

Traduzido por Ana Paula Costa

Estrutura (struct)

Na aula 13 aprendemos que um array pode armazenar variáveis do mesmo tipo de uma forma bem ordenada e indexada, como um arquivo em que cada gaveta contém o mesmo tipo de informação. Se quisermos agrupar variáveis que não são do mesmo tipo, podemos fazê-lo com uma estrutura (struct).
 

Os três arquivos armazenando coisas
do mesmo tipo, tal como os arrays. O da esquerda podia 
conter "bytes", o do meio
"inteiros" e o da direita "reais".

 

O arquivo do centro é usado para
armazenar coisas de vários tipos. Da mesma forma,
uma estrutura é usada para armazenar variáveis
de tipos diferentes, inteiros, reais, ou
qualquer outro, todas juntas na mesma caixa.


 
 Uma estrutura é um conjunto de variáveis de tipos distintos


Declaração de uma estrutura


Cada variável dentro de uma estrutura é chamada campo. Na figura ao lado temos 5 campos: um int (b), um float (f), um char (c), um array unidimensional de floats (r) e um array de duas dimensões de doubles (m).

Para declarar uma estrutura fazemos o seguinte:
 

struct {
   tipo1 item1
   tipo2 item2;
      |
   tipoN itemN;
} nome;
com
nome: o nome da variável que suporta a estrutura.
item1..itemN: o nome dos vários campos da estrutura. Estes têm as mesmas regras dos outros identificadores para variáveis, funções, etc. De notar que podemos colocar tantos campos na estrutura quantos desejarmos, com qualquer combinação de tipos.
tipo1..tipoN: o tipo dos campos da estrutura. Pode ser qualquer tipo de variável que conhecemos, incluindo estruturas!

Por exemplo, a definição de uma estrutura contendo a informação de um estudante pode ter campos para o nome, ano, e propinas pagas:
 struct {
   char name[20];
   int year;
   int propinas; 
 } student;
Esta estrutura pode conter apenas a informação de um único estudante. Mais tarde iremos ver como criar arrays de estruturas.


Utilização de uma estrutura

Para aceder a uma estrutura utilizamos o formato
 
 nome.campo 

Por exemplo, para atribuir valores à estrutura estudante podemos fazer o seguinte:

  strcpy(student.name, "Peter Stallinga");
  student.year = 2002;
  student.propinas = 1;

para recordar o funcionamento da função strcpy, ver a aula sobre strings.
Outro exemplo:

  struct {
      float x;
      float y;
  } coordinate;

  coordinate.x = 1.0;
  coordinate.y = 0.0;

Isto não é propriamente um conjunto de variáveis de diferentes tipos, portanto também podíamos utilizar um array:

  float coordinate[2];

  coordinate[0] = 1.0;
  coordinate[1] = 0.0;

mas, a primeira versão, com a estrutura, é mais lógica.
Ainda outro exemplo:

  struct {
    char rua[20];
    int numero;
    int andar;
    char porta;
  } address;

  strcpy(address.rua, "Rua Santo Antonio");
  address.numero = 34;
  address.andar = 3;
  address.porta = 'E';

  printf("%s %d", address.rua, address.numero);
  printf("%d %c", address.andar, address.porta);

Rua Santo Antonio 34
3 E


Arrays de estruturas, estruturas de arrays

Os exemplos anteriores utilizam estruturas simples. Contudo, com a informação da aula sobre arrays (aula 13), sabemos como construir um array que pode armazenar informação sobre muitos objectos iguais do mesmo tipo, mesmo estruturas. Vamos criar um array de 2000 estudantes:
(Questão: Quantos bytes ocupa esta variável em memória? Resposta no final)
 
 struct {
   char name[20];
   int year;
   int propinas; 
 } students[2000];
  i = 1055;
  strcpy(students[i].name, "Peter Stallinga");
  students[i].year = 2002;
  students[i].propinas = 1;

De notar a estrutura de arrays de estruturas. students é um array de estruturas, portanto, students[i] é uma destas estruturas e se queremos atribuir algum valor a um campo utilizamos o ponto e o nome do campo, assim students[i].year é um inteiro que contém o ano do estudante número i.
A sintaxe students.year[i] estaria errada (podíamos utilizar desta forma se tivéssemos uma única estrutura students contendo um campo year que fosse um array)
Igualmente errado seria: students.[i]year, que não faz qualquer sentido. Cuidado com o sítio onde se colocam os pontos.

Mais tarde iremos ver que podemos facilmente declarar variáveis do tipo array de estruturas (ver aula 19).


Teste Rápido:
Para testar os conhecimentos sobre o que aprendeu nesta aula, prima aqui para fazer um teste on-line. De notar que este Não é o formato que será utilizado no teste final!
Resposta à questão no texto: 2000 x (20+2+2) = 48000 bytes.

Peter Stallinga. Universidade do Algarve, 28 November 2002