quinta-feira, 21 de outubro de 2010

Passando um vetor para uma função auxiliar

Essa é uma parte muito importante e muitas vezes pouco compreendida no estudo de vetores.

Vamos supor que a nossa tarefa seja passar os mil valores guardados num vetor para uma função poder fazer uma operação qualquer com todos eles.

Seria surreal você ter que fazer uma chamada de função com mais de mil parâmetros, então, logo descartamos a possibilidade de passar o valor de cada índice do vetor pra função.

Você lembra que a variável declarada como vetor guarda nela própria um endereço de memória, certo? Então, que tal passar esse valor para a função?

Essa é a melhor maneira de se passar um vetor para uma função. Você não passa os valores de seus índices, você passa um endereço de memória apenas.

A principal diferença entre fazer isso ou passar o valor da variável é que, quando você passa apenas o valor da variável, se esse valor for modificado dentro da função pouco importa para a função que a chamou, já que esse valor vai estar armazenado em uma outra variável local da função chamada; agora, quando você passa um endereço de memória, se você fizer qualquer modificação com o valor dentro desse endereço de memória ele vai ser alterado também na função que chamou, já que é o mesmo elemento.

Acredito que isso tenha ficado um pouco vago, tenha em mente o seguinte. O que diferencia dois elementos na memória é o endereço deles. Quando você passa o valor de um elemento para uma função o que essa função faz é imediatamente guardar esse valor em uma variável presente em um endereço de memória só conhecido por essa função, por isso não faz diferença alterar esse valor.

Ok, como pegamos esse endereço de memória então, preciso de uma variável especial. Não?
Exatamente! Não faz sentido pegar esse endereço de memória com uma variável do tipo int, por exemplo. Para isso existem as variáveis do tipo ponteiro que armazenam endereços de memória. Ponteiros são declarados com um * antes do nome dele.

tipoDoPonteiro * nomeDoPonteiro;

Então, para pegar o nosso vetor com mil posições bastaria fazer o seguinte:
A função que recebe o vetor vai ter como parâmetro um ponteiro do tipo do vetor. Supondo que o nosso vetor seja de char's e que nossa função não retorna nada, ficaria:

void nomeDaFunção (char * vetor);

Repare que não é preciso dizer o tamanho do vetor, visto que ele só pega um endereço de memória não faz diferença. Por isso, pode ser preciso passar o tamanho do vetor também.

Na chamada da função você faria simplesmente:

nomeDaFunção (vetor);

Existe um outro modo de declarar a sua função que recebe o vetor, que é:

void nomeDaFunção (char vetor[]);

Isso indica que você vai receber um vetor e o que ele vai fazer na verdade é criar um ponteiro, bem como já foi mostrado.

Dentro da função você vai operar com ele como um vetor normal.

É isso aí pessoal!

Até mais!

Nenhum comentário:

Postar um comentário