Passagem de Parâmetros


Os parâmetrosd formais (variáveis locais a função chamada) são inicializados com o valor dos parâmetros reais.

Passagem por valor- O valor dos parâmetros formais sendo alterado durante a execução da função não acarretará em nehuma modificação no valor dos parâmetros reais (variáveis da função chamadora).

Passagem por referência- Qualquer alteração no valor dos parâmetros formais durante a execução da função será refletida no valor de seus parâmetros reais correspondentes.

A linguagem C não implementa automaticamente a passsagem de parâmetros por referência. Esta deve ser simulada através da utilização de ponteiros. Ao invés de passarmos a variável como parâmetro, passamos o endereço desta variável. Sendo assim, a função que recebe pode utilizar seu valor através de indireção se ele for alterado essa alteração irá refletir fora da função.

Ex:
#include < stdio.h >
void troca(int *a,int *b);
void main()
{
int x=5;
int y=10;
printf("%d %d\n",x,y);
troca (&x,&y);
printf("%d %d",x,y);
}

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

Será impresso na forma:
5 10
10 5
Passagem de vetor como parâmetro


Quando efetuamos a passagem de um vetor como parâmetro devemos ter em mente que o que está sendo passado não é realmente o vetor e sim um ponteiro para ele.

Por exemplo, se temos uma função com a seguinte declaração:
void teste (char nome[31] )


A lista de parâmetros formais nos dá a falsa impressão de que está sendo criada uma variável local do tipo vetor de 31 caracteres e que essa variável receberá o valor do parâmetro real correspondente. Isso não é o que acontece. Mesmo com o parâmetro formal definindo o número de elementos, não é criado um vetor de caracteres e sim um ponteiro para caracter, que receberá o endereço passado no parâmetro real (normalmente o endereço do primeiro elemento).

Considerando então que o tamanho é desnecessário neste caso, ficamos com a seguinte declaração:

void teste(char nome[] )


Sabemos então que especificando o parâmetro formal desta maneira, estamos criando um ponteiro para caracter, porém conhecemos uma outra maneira mais "clara" de criar este ponteiro:

void teste(char *nome)


A palavra const pode ser usada para transformar a passagem de vetor, uma passagem por valor e não por referência.

void teste(const char *nome) ou void teste(const char nome[] )