Contents

Capítulo 5 - Arrays


botões
botões Conteúdo Capítulo anterior Capítulo seguinte

Os arrays em C são semelhantes aos que são definidos e usados em outras linguagens. No entanto há algumas diferenças na sintaxe de declaração e utilização e alguma interligação com os apontadores, como veremos mais à frente.


Tópicos

setas
setas Up

Arrays unidimensionais e multidimensionais

Os arrays declaram-se no C como se declaram as outras variáveis, acrescentando apenas um valor para a sua dimensão.

Assim começa-se por indicar o tipo de valores que vão estar contidos em cada posição do array, seguindo-se o nome do próprio, e terminando com a indicação da dimensão (número de elementos) entre parêntesis retos.

Por exemplo, para definir um array de 50 inteiros poderia usar-se a seguinte declaração:

int numbers[50];

Nota: Em C os arrays começam sempre no índice 0 e vão até ao valor da dimensão menos 1.

Na definição de cima os índices válidos do array numbers vão desde 0 até 49.

O acesso aos elementos individuais do array faz-se utilizando também parêntesis retos.

Exemplos:

terceiro_valor = numbers[2];

numbers[5] = 100;
  

Os arrays multidimensionais declaram-se, indicando as várias dimensões umas a seguir às outras, da mesma forma que a primeira dimensão.

Exemplo, para duas dimensões:

float matriz[50][50];

Para maiores dimensões basta acrescentar à declaração mais elementos [...]:

double big_array[10][10][22]...[8];

O acesso aos elementos individuais faz-se da mesma forma:

valor = matriz[10][4];
matriz[0][1] = 100;

Nota: Em C os arrays são armazenados na memória para que dois elementos consecutivos (na memória) correspondem prioritariamente a uma variação do último índice. Para arrays bidimensionais corresponde a um armazenamento linha a linha.

setas
setas Up

Strings

Na linguagem C os strings são simplesmente arrays de caracteres. No entanto a linguagem propriamente dita não tem quaisquer facilidades para o manuseamento de strings (exceto para a primeira inicialização). Apenas na biblioteca standard encontra-se uma vasta gama de funções de manuseamento de strings.

Uma declaração de uma string pode conter 50 caracteres:

char nome[51];

Como o C não manuseia strings diretamente todas as instruções seguintes não estão corretas:

char nome[50], apelido[50], nome_completo[100];
nome = "Arnold";             /* Ilegal */
apelido = "Schwarznegger";  /* Ilegal */
nome_completo = "Mr. " + nome + ' ' + apelido;  /* Ilegal */

No entanto a seguinte declaração com inicialização é válida:

char nome[50] = "Dave";

Para permitir a existência de strings de tamanho variável, quer a inicialização anterior, quer todas as funções de strings da biblioteca standard acrescentam um caractere final a todos os strings. Esse caractere (que marca o fim de uma string) tem o valor 0 (código 0, não o caractere '0'). Se quisermos representar esse caractere podemos escrever '\0'.

A inicialização anterior produz a seguinte imagem na memória:

Imagem da memória

Para imprimir uma string no ecrã pode usar-se a função printf(), com um especificador no 1º parâmetro igual a %s, no local da variável do tipo string (char []):

printf("%s", nome);
setas
setas Up

Exercícios

  1. Escreva um programa que leia um array de qualquer tipo do teclado (elemento a elemento), pergunte um valor ao utilizador, e procure esse valor no array, indicando a posição onde está, se for encontrado.
  2. Escreva um programa que leia um texto do ecrã com múltiplas linhas e caractere a caractere. O fim do texto é marcado com EOF (end of file) que se obtém com CTRL-D no Unix e CTRL-Z no DOS. As linhas de texto deverão depois ser escritas no ecrã de trás para a frente (em reverso).
  3. Escreva um programa que leia um texto (múltiplas linhas) até à ocorrência de EOF. O programa deverá fazer uma estatística do comprimento das palavras lidas, i. e., deverá indicar o número de palavras com 1 letra, o número de palavras com 2 letras, ..., etc.
setas
setas Up