Cpc 00
Até então, os tipos estruturados eram definidos somente em função de tipos básicos, como no exemplo mostrado abaixo:
struct Ponto
{ int x; Int y;}
Porém, é possível, também, definirmos um tipo estruturado da seguinte forma:
struct Ponto
{ int x; Int y; Int * z;}
Ao definir um novo tipo, nada em memória é alocado. Somente após declarar variáveis do tipo struct ponto criado acima é que serão alocados conteúdos de memória para armazenar os campos para as variáveis declaradas. Suponha que as variáveis p e q foram declaradas:
struct ponto p; struct ponto q;
Em memória, teremos:
ID DO REG. | ID. DA VARIÁVEL | CONTEÚDO DE MEMÓRIA | END. DE MEMÓRIA | | | | | | | | | | x | Lixo | 120m | q | y | Lixo | 116m | | z | Lixo | 112m | | x | Lixo | 108m | p | y | Lixo | 104m | | z | Lixo | 100m |
Os campos x e y de p e q devem receber valores inteiros, pois, do contrário, erro de checagem de tipo ocorrerá. Já os campos ponteiros z das variáveis q e p terão que receber um endereço de memória que aponta para um inteiro. Mas, atenção, se um ponteiro aponta para um endereço de memória que contém um inteiro, mas que pertence a um registro, então, na verdade, ele está apontando para o registro e não para um inteiro. Como exemplo, considere a variável a definida abaixo:
int a;
Após executar o comando acima, teremos em memória:
| | | | | a | Lixo | 124m | | x | Lixo | 120m | q | y | Lixo | 116m | | z | Lixo | 112m | | x | Lixo | 108m | P | y | Lixo | 104m | | z | Lixo | 100m |
Se fizermos:
q.z = &a; struct ponto * r = &q;
teremos:
| r | 120m | 128m | | a | Lixo | 124m | | x | Lixo | 120m | q | y | Lixo | 116m | | z | 124m | 112m