Introdução

Um vetor e um conjunto de variáveis de um mesmo tipo de dado as quais são acessadas e referenciadas através da posição (índices) e do identificador do vetor. Um vetor pode ser multidimensional, ou seja, pode armazenar valores em 2 ou mais dimensões.


Vetor Unidimensional

A declaração de um vetor unidimensional segue a sintaxe abaixo:

<tipo-do-dado> <identificador>[<tamanho>];

Onde:

<tipo-do-dado>: tipo do dado armazenado em cada elemento do vetor.
<identificador>: identificador usado para referenciar a variável vetor.
<tamanho>: número de elementos do vetor.

Exemplos:

long inteiros[10]; // vetor com 10 números inteiros longos
char texto[1000];  // vetor com 1000 caracteres

Manipulando Vetores

O identificador de um vetor em C é, na verdade, um ponteiro que aponta para o primeiro elemento do vetor. Quando declaramos long inteiros[10]; estamos reservando um conjunto de dez posições de memória contíguas, cada uma delas com 4 bytes (um long tem 4 bytes). Logo, o vetor completo tem 40 bytes.

Para saber o número de bytes ocupado por uma variável, podemos usar a função sizeof, que recebe como parâmetro uma variável e retorna o número de bytes ocupados pela mesma.

Exemplo: Descobrindo o número de bytes ocupados por uma variável

main() {
   char c;
   int i;
   long l;
   long vl[10];
   float f;
   double d;

   printf("bytes de cada tipo:\n");
   printf("char %d\n", sizeof(c));
   printf("int %d\n", sizeof(i));
   printf("long %d\n", sizeof(l));
   printf("long[10] %d\n", sizeof(vl)); 
   printf("float %d\n", sizeof(f));
   printf("double %d\n", sizeof(d));
}

É importante notar que vetores em C começam pelo índice 0. Por exemplo, para referenciar o primeiro elemento usamos o índice 0 e décimo elemento, usamos o índice 9.

Exemplo: Ordenando um vetor de números inteiros (long).

main() {
   long Vetor[100];
   long I, N, Menor, Ordenadas, Temp;

   printf("N:"); scanf("%d", &N);

   for (I = 0; I < N; I++)
      scanf("%d", &Vetor[I]);

   Ordenadas = -1;

   do {
      Ordenadas++;

      Menor = Ordenadas;

      for (I = Ordenadas + 1; I < N; I++)
         if (Vetor[I] < Vetor[Menor])
            Menor = I;

      Temp = Vetor[Ordenadas];
      Vetor[Ordenadas] = Vetor[Menor];
      Vetor[Menor] = Temp;
   }
   while (Ordenadas < N);

   for (I = 0; I < N; I++)
      printf("%d\n", Vetor[I]);
}

Vetores e Ponteiros

Conforme mencionado anteriormente, uma variável do tipo vetor é equivalente a um apontador para o primeiro elemento do vetor, com a facilidade de usar um índice para acessar o elemento desejado. Além desta forma, podemos usar apontadores puramente para acessar e manipular o vetor como um todo e seus elementos e vice-versa.

Exemplo: Função que retorna o maior valor encontrado em vetor da posição 0 até um certo ponto. O último parâmetro recebe a posição do valor no vetor.

float BuscaMaior(float *v, int t, int *p) {
   float Maior = v[0];
   *p = 0;

   int i;
   for (i = 1; i <= t; i++)
      if (v[i] > Maior) {
         Maior = v[i];
         *p = i;
      }

   return(Maior);
}

main() {
   float valores[4];
   valores[0] = 19.0;
   valores[1] = 11.0;
   valores[2] = 5.0;
   valores[3] = 32.0;

   int pos;
   float m = BuscaMaior(valores, 3, &pos);

   printf("valor: %f na posicao %d\n", m, pos);

   m = BuscaMaior(valores, 2, &pos);
   printf("valor: %f na posicao %d", m, pos);
}

Vetor Multidimensional

A declaração de um vetor multidimensional segue a sintaxe abaixo:

<tipo-do-dado> <identificador> <tamanhos>;

Onde:

<tipo-do-dado>: tipo do dado armazenado em cada elemento do vetor.
<identificador>: identificador usado para referenciar a variável vetor.
<tamanhos>: seqüência dos tamanhos de cada dimensão.

Exemplos:

long MatrizInteiros[3][3]; // matriz 3x3
char texto[1000][80];      // matriz que representa um texto com 1000 linhas de 80 colunas

Exemplo: Função que retorna o maior valor encontrado em uma matriz até um certo ponto. Os últimos parâmetros recebem a linha e a coluna do valor na matriz.

float BuscaMaiorMatriz(float v[3][3], int maxLin, int maxCol, int *lin, int *col) {
   float Maior = v[0][0];
   *lin = *col = 0;

   int i, j;
   for (i = 0; i < maxLin; i++)
      for ( (j = (i == 0 ? 1 : 0)); j < maxCol; j++)
         if (v[i][j] > Maior) {
            Maior = v[i][j];
            *lin = i;
            *col = j;
         }

   return(Maior);
}

main() {
   float valores[3][3];

   valores[0][0] = 19.0; valores[0][1] = 11.0; valores[0][2] = 5.0;
   valores[1][0] = 32.0; valores[1][1] = 2.0; valores[1][2] = 12.0;
   valores[2][0] = 5.5; valores[2][1] = 4.3; valores[2][2] = 41.0;

   int lin, col;
   float m = BuscaMaiorMatriz(valores, 3, 3, &lin, &col);

   printf("valor: %f na posicao [%d,%d]\n", m, lin, col);

   m = BuscaMaiorMatriz(valores, 2, 3, &lin, &col);
   printf("valor: %f na posicao [%d,%d]", m, lin,col);
}

Ordenação de Vetores

Existem vários métodos de ordenação. Um método bastante simples e conhecido é o método da bolha. Nele, a ordenação tem como princípio "borbulhar" o menor valor para o início do vetor ou o maior para o final. Na implementação abaixo, o menor valor é "borbulhado" para o início. Logo em seguida, o segundo menor valor é "borbulhado" para a segunda posição do vetor. Este processo se repete até que não haja troca alguma durante uma iteração ou quando o último elemento a ser ordenado é alcançado.

Exemplo: Ordenando um vetor através do método da bolha.

void troca(int* a, int* b) {
   int aux = *a;
   *a = *b;
   *b = aux;
}

void bolha (int *primeiro, int *ultimo) {
   int naoTrocou;
   int *posAtual;
   for (; ultimo > primeiro; --ultimo) {
      naoTrocou = 1;
      for (posAtual = primeiro; posAtual < ultimo; ++posAtual) {
         if (*posAtual > *(posAtual+1)) {
            troca (posAtual, posAtual+1);
            naoTrocou = 0;
         }
      }
      if (naoTrocou) return;
   }
}

void exibir(int *primeiro, int n) {
   int i = 0;
   for (; i < n; i++) {
      printf("%d ", primeiro[i]);
   } 
}

main() {
   int v[10];
   v[0] = 6;
   v[1] = 9;
   v[2] = 3;
   v[3] = 5;
   v[4] = 4;
   v[5] = 8;

   printf("antes: ");
   exibir(v, 6);

   bolha(v, &v[5]);

   printf("\ndepois: ");
   exibir(v, 6);
}