14.03.2015 Views

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

11.1.3 - Matrizes de estruturas<br />

Um estrutura é como qualquer outro tipo de <strong>da</strong><strong>do</strong> no C. Podemos, portanto, fazer matrizes de estruturas. Vamos ver<br />

como ficaria a declaração de uma matriz de 100 fichas pessoais:<br />

struct ficha_pessoal fichas [100];<br />

Poderíamos então acessar a segun<strong>da</strong> letra <strong>da</strong> sigla de esta<strong>do</strong> <strong>da</strong> décima terceira ficha fazen<strong>do</strong>:<br />

fichas[12].endereco.sigla_esta<strong>do</strong>[1];<br />

Atribuin<strong>do</strong><br />

Podemos atribuir duas estruturas que sejam <strong>do</strong> mesmo tipo. O C irá, neste caso, copiar uma estrutura na outra. Esta<br />

operação não apresenta problemas pois quan<strong>do</strong> declaramos<br />

struct ficha_pessoal ficha;<br />

ficha não é um ponteiro, mas uma estrutrura. Veja as linhas abaixo:<br />

void main()<br />

{<br />

struct ficha_pessoal primeira, segun<strong>da</strong>;<br />

Le_<strong>da</strong><strong>do</strong>s(&primeira);<br />

segun<strong>da</strong> = primeira;<br />

Imprime_<strong>da</strong><strong>do</strong>s(segun<strong>da</strong>);<br />

}<br />

São declara<strong>da</strong>s duas estruturas <strong>do</strong> tipo ficha_pessoal, uma chama<strong>da</strong> primeira e outra chama<strong>da</strong> segun<strong>da</strong>. Supon<strong>do</strong> que<br />

haja declara<strong>da</strong> uma função Le_<strong>da</strong><strong>do</strong>s() que faça a leitura de uma estrutura, admitimos que após a execução <strong>da</strong><br />

segun<strong>da</strong> linha de main(), a estrutura primeira estará preenchi<strong>da</strong> com <strong>da</strong><strong>do</strong>s váli<strong>do</strong>s. Os valores de primeira são<br />

copia<strong>do</strong>s em segun<strong>da</strong> apenas com a expressão de atribuição:<br />

segun<strong>da</strong> = primeira;<br />

To<strong>do</strong>s os campos de primeira serão copia<strong>do</strong>s na ficha chama<strong>da</strong> segun<strong>da</strong>. Deve mos tomar cui<strong>da</strong><strong>do</strong> com a seguinte<br />

declaração:<br />

struct ficha_pessoal fichas [100];<br />

pois neste caso fichas é um ponteiro para a primeira ficha. Se quisermos a estrutura completa <strong>da</strong> n-ésima ficha<br />

devemos usar fichas[n-1].<br />

11.1.4 - Passan<strong>do</strong> para funções<br />

No exemplo apresenta<strong>do</strong> no ítem usan<strong>do</strong>, vimos o seguinte coman<strong>do</strong>:<br />

strcpy (ficha.nome,"Luiz Osval<strong>do</strong> Silva");<br />

Neste coman<strong>do</strong> um elemento de uma estrutura é passa<strong>do</strong> para uma função. Este tipo de operação pode ser feita sem<br />

maiores considerações.<br />

Podemos também passar para uma função uma estrutura inteira. Veja a seguinte função:<br />

void PreencheFicha (struct ficha_pessoal ficha)<br />

{<br />

...<br />

}<br />

Como vemos acima é fácil passar a estrutura como um to<strong>do</strong> para a função. Devemos observar que, como em qualquer<br />

outra função no C, a passagem <strong>da</strong> estrutura é feita por valor. Isto significa que alterações na estrutura dentro <strong>da</strong> função<br />

não terão efeito na variável fora <strong>da</strong> função. Mais uma vez podemos contornar este pormenor usan<strong>do</strong> ponteiros e<br />

passan<strong>do</strong> para a função um ponteiro para a estrutura.<br />

11.1.5 - Ponteiros<br />

Podemos ter um ponteiro para uma estrutura. Vamos ver como poderia ser declara<strong>do</strong> um ponteiro para as estruturas<br />

de ficha que estamos usan<strong>do</strong> nestas seções:<br />

struct ficha_pessoal *p;<br />

Os ponteiros para uma estrutura funcionam como os ponteiros para qualquer outro tipo de <strong>da</strong><strong>do</strong>s no C. Há, entretanto,<br />

um detalhe a ser considera<strong>do</strong>. Se apontarmos o ponteiro p declara<strong>do</strong> acima para uma estrutura qualquer e quisermos<br />

acessar um elemento <strong>da</strong> estrutura poderíamos fazer:<br />

(*p).nome<br />

Este formato raramente é usa<strong>do</strong>. O que é comum de se fazer é acessar o elemento nome através <strong>do</strong> opera<strong>do</strong>r seta (->).<br />

Assim faremos:<br />

p->nome<br />

A declaração acima é muito mais fácil e concisa. Para acessarmos o elemento CEP dentro de endereco faríamos:<br />

Pág. 77

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!