# Programar em C/Estruturas
## Estruturas

As estruturas (structs) permitem com que possamos ter variáveis de vários tipos aglomerados sob o mesmo nome. E esse mesmo nome vai passar a ser um novo tipo de dados tal como o int ou float.
Mas o uso disto é que podemos ter valores que tenham alguma relação lógica, por exemplo guardar um int de idade e um string de nome. Isto pode ser atributos de uma pessoa. Ou seja podemos empacotar várias variáveis de vários tipos com o objetivo de representar o mundo real e dar um nome a essas variáveis todas.
Ao fazer isto criamos um tipo de dados da mesma forma como fazemos em relação ao int ou ao float.

## Declarar uma estrutura

A sintaxe é:
Aqui o tipo struct indica que vamos criar uma estrutura. O nome ou identificador pode ser alunos, família, etc . (têm de ser válidos identifiers) Não esquecer o ponto e vírgula “;” no fim da declaração. Campo_um e Campo_dois são variáveis membro – member variables – ou campo da estrutura.
Assim criamos novos tipos de dados.
Primeiro método:
Aqui o identificador do tipo "struct" é "minha_estrutura" dentro dessa estrutura temos três campos o ultimo é "fruta"
Agora podemos usar esse tipo "struct" para definir variáveis.
Para ter acesso aos membros definidos dentro da estrutura utilizamos um operador de seleçao de membro "."(um ponto).
Nos dá o primeiro caracter da palavra contida dentro do membro "fruta".
Para inicializar um campo da estrutura o processo é o mesmo que usamos com as variáveis.

## Matrizes de estruturas

Uma estrutura é como qualquer outro tipo de dado no C. Podemos, portanto, criar matrizes de estruturas. Vamos ver como ficaria a declaração de um vetor de 100 fichas pessoais:
Poderíamos então acessar um campo dando um índice do vetor fichas:

## Declarar instâncias (objetos) da estrutura

Podemos declarar os objetos de duas formas:
* Ao mesmo tempo que declaramos a estrutura
* Ou como uma variável normal
E até podemos declarar um array delas
Pergunta: como é que é feito exatamente os objetos?
Para cada objeto vão ser feito uma cópia dos elementos da estrutura.
Agora isso significa que os objetos são distintos entre si em termos de reserva de memória? ie, à medida que enumero os objetos vão ser reservado para cada objeto o tamanho x de bytes? ou somam-se todos os objetos e reserva-se para todos os objetos de uma forma seguida? Penso que deve ser a 1ª opção.
Se tivermos apenas um objeto (ou variável da estrutura) não é necessário darmos o nome da estrutura

## Acessar as variáveis membro das estruturas

Agora queremos dar valores a cada uma das pessoas, queremos dar o nome e a altura, para isso faríamos;
A forma genérica é:
ou seja
Exemplo

## Iniciar uma estrutura

Podemos iniciar uma estrutura usando uma lista de iniciação, que seria algo como:
isto basicamente é igual a arrays, apenas com a diferença de termos tipos diferentes. Logo a ordem vai interessar, por exemplo se escrevêssemos

## Ponteiros para estruturas

Nós criámos algo
Vejamos que temos um ponteiro como instância.
Como já devem ter deduzido o operador -> será muito similar a pmovie->title é equivalente a (*pmovie).title
Mas olhem que é diferente a:

## Passando estruturas como argumento de funções

A estrutura é passada como ponteiro.

## Estruturas aninhadas

A ideia é ter uma estrutura dentro de outra estrutura.
Reparem que a estrutura Date tem de ser declarada antes da estrutura Person, pois caso contrário o compilador não entenderia o tipo declarado na estrutura Person.
Pergunta: Por que não podemos acrescentar mais membros (campos) nas estruturas?
Porque elas são compiladas estaticamente com posição de memória já alocada e tipo já conhecido em tempo de compilação
Pergunta: Ao invés de termos apenas variáveis nas estruturas, poderíamos ter também funções?
Sim, como ponteiros para funções.