Os dados que usaremos possuem o
tipo compostos e estruturados, ou seja, são formados das estruturas mais
simples que estão disponíveis. O estudo dessas estruturas envolve uma analise
de como se combinam de modo a se formar a composição e de como extrair um
componente especifico, começaremos pelo vetor e sua forma mais simplória, o
vetor unidimensional, cuja definição será de um conjunto finito e ordenado de
elementos homogêneos, entendemos que finito é o numero determinado de elementos
no vetor, ordenado é a forma em que os elementos do vetor estão organizados,
como elemento 1, 2, 3,... até seu tamanho e homogêneo onde os elementos são do
mesmo tipo.
As duas operações básicas que
acessam um vetor são o armazenamento e a extração, como podemos ver a operação
de armazenamento recebe um vetor a e um índice i, junto de um elemento x, para
extração basta apenas vetor a e índice i para recuperar o elemento.
No exemplo abaixo, foi incluído
as funções store e extract para indicar a ação:
#define
ARRAY_SIZE 100
void store(char [], int, char);
char extract(char [], int);
void main(void)
{
char Array[ARRAY_SIZE];
int i;
for (i = 0; i < ARRAY_SIZE; i++)
{
store(Array,
i, i);
}
for (i = 0; i < ARRAY_SIZE; i++)
{
printf(" %i", extract(Array, i));
}
}
void store(char a[], int i, char x)
{
a[i] = x;
}
char extract(char a[], int i)
{
return
a[i];
}
|
No entanto, a linguagem C permite
seu uso de forma muito mais simples, bastando declarar como mostrado a seguir
com resultados iguais:
void main(void)
{
char a[100];
int i;
for (i =
0; i < 100; i++)
a[i] = i;
for (i =
0; i < 100; i++)
printf("
%i", a[i]);
}
|
Isso
serve para comprovar o quão simples um vetor pode ser incluindo a forma de
usa-lo. Basta declarar “char a[100];” para se ter
implementado um vetor unidimensional de 100 posições sucessivas. Na linguagem C,
a variável vetor é implementada como variável ponteiro, a diferença entre
declarações como char *a, e char a[100] é
que a ultima reserva 100 posições começando em a, ou seja, o elemento
mostrado em a[i] é igual a *(a+i). Apesar de em C todos os elementos de um vetor
ter tamanho fixo e predeterminado, podemos criar um método para um vetor de
tamanho variável reservando um conjunto contiguo de posições na memória, cada
uma das quais armazenando um endereço. Cada posição da memória é o endereço do
vetor, de tamanho variável, em alguma outra parte da memória, semelhante à
forma com que as strings em C é tratadas, uma string é implementada como um vetor, de modo que um
vetor de strings, é na verdade um vetor de vetores, vetor bidimensional.
Vejamos duas técnicas que resultam num vetor de strings de tamanho variável.
Podemos
incluir no primeiro byte o tamanho da string:
->
|
4
|
H
|
E
|
L
|
L
|
O
|
...
|
...
|
...
|
|
->
|
4
|
W
|
O
|
R
|
L
|
D
|
...
|
...
|
...
|
|
->
|
2
|
M
|
Y
|
...
|
...
|
...
|
...
|
...
|
...
|
|
->
|
4
|
F
|
I
|
R
|
S
|
T
|
...
|
...
|
...
|
|
->
|
6
|
P
|
R
|
O
|
G
|
R
|
A
|
M
|
...
|
Usar um terminador
nulo:
->
|
H
|
E
|
L
|
L
|
O
|
\0
|
...
|
...
|
...
|
|
->
|
W
|
O
|
R
|
L
|
D
|
\0
|
...
|
...
|
...
|
|
->
|
M
|
Y
|
\0
|
...
|
...
|
...
|
...
|
...
|
...
|
|
->
|
F
|
I
|
R
|
S
|
T
|
\0
|
...
|
...
|
...
|
|
->
|
P
|
R
|
O
|
G
|
R
|
A
|
M
|
\0
|
...
|
Claro que tudo isto
envolve um nível adicional de acesso, que reduz a eficiência, mas plenamente justificável pela conveniência de manter tal característica.