Calcular o tamanho de um vetor
Em diversas situações de manipulação de um vetor é preciso saber o tamanho desse vetor (saber quantos elementos cabem no vetor) para a operação. Nessas situações é comum ter uma variável que recebe o tamanho do vetor, ou que é incrementada conforme valores são fornecidos. Mas existem situações na qual não se tem esse valor ou é melhor descobrir esse valor ou invés de solicitar (como eu exemplifico mais adiante).
Considerando inicialmente descobrir o tamanho do vetor quando esse vetor é um vetor de caracteres (uma string). Para as strings existe uma função que retorna o tamanho da string, que é a função strlen(). Para essa função, basta informar o vetor de caracteres e ela retorna a quantidade de caracteres, embora isso não seja realmente o tamanho do vetor (o tamanho do texto armazenado pode ser menor do que o tamanho do vetor). O código abaixo ilustra a utilização da strlen().
#include <stdio.h>
int main() {
char nome[] = "benjamin";
int len = strlen(nome);
printf("%i", len);
}
O código abaixo é o código que realmente retorna o tamanho do vetor, seja ele de caracteres ou de valores numéricos. No código eu deixo comentada a linha 5 com o cálculo sizeof(var)/sizeof(int). Isso porque eu prefiro o cálculo feito na linha 6, embora seja mais fácil de explicar com o cálculo que não utilizei.
A função sizeof(var) retorna o tamanho alocado na memória para aquela variável de vetor var. Ou seja, essa função sozinha não retorna quantos elementos cabem no vetor e sim número de bytes que a variável ocupa. Por isso é feita a divisão por sizeof(int). Uma vez que o vetor var é um vetor de inteiros, saber quantos bytes ocupa um inteiro fará com que o resultado da divisão seja a quantidade de elementos do vetor. Eu prefiro utilizar como denominador a chamada da função sizeof(var[0]) (como feito na linha 6) porque ela independe de saber qual o tipo da variável na declaração do vetor. Como o resultado é o mesmo, não se corre o risco de precisar alterar o tipo de vetor e esquecer de alterar o tipo no denominador.
#include <stdio.h>
int main() {
int var[] = {1, 2, 3, 4, 5, 0};
//int len = sizeof(var)/sizeof(int);
int len = sizeof(var)/sizeof(var[0]);
printf("%i", len);
}
Acho que o uso mais comum de precisar saber o tamanho do vetor está associado com a elaboração de funções. Na função zeraVetor1() apresentada abaixo, é solicitada como parâmetros o vetor e si e o tamanho desse vetor. Ou seja, para chamar essa função será sempre necessário fornecer esses dois parâmetros, o que torna o uso da função mais burocrático. Considerando a necessidade de zerar um vetor chamado var com 9 posições, a chamada da função fica: zeraVetor1(var, 9);
void zeraVetor1(floar vetor[], int tam) {
int i;
for (i=0; i<tam; i++) {
vetor[i] = 0;
}
}
Considero melhor a definição da função zeraVetor2(), que solicita apenas o vetor e calcula seu tamanho, facilitando a utilização. Agora, para zerar o vetor var de 9 posições, a chamada da função é: zeraVetor2(var);
void zeraVetor2(floar vetor[]) {
int i, tam = sizeof(vetor)/sizeof(vetor[0]);
for (i=0; i<tam; i++) {
vetor[i] = 0;
}
}