Para entender como os parâmetros variáveis funcionam, vamos ver como nos saímos ao implementar uma função swap em C. Para implementar uma função swap, talvez você queira passar por duas variáveis fazendo-as trocar seus valores. Eis uma tentativa de implementação. Digite e execute a seguinte codificação e veja o que acontece:
#include<stdio.h> void swap(int i, int j) { int t; t=i; i=j; j=t; } void main() { int a,b; a=5; b=10; printf("%d %d\n", a, b); swap(a,b); printf("%d %d\n", a, b); }
Ao executar este programa, você verá que nenhuma troca ocorrerá. Os valores de a e b são passados para troca, a função swap os troca, porém quando a função retorna, nada acontece.
Para que esta função opere corretamente, você pode usar ponteiros:
#include<stdio.h> void swap(int *i, int *j) { int t; t = *i; *i = *j; *j = t; } void main() { int a,b; a=5; b=10; printf("%d %d\n",a,b); swap(&a,&b); printf("%d %d\n",a,b); }
Para ter uma idéia do que esta codificação faz, imprima-a e desenhe os inteiros a e b e digite 5 e 10 neles. Agora desenhe os dois ponteiros i e j, juntamente com o inteiro t. Quando swap é executado, ele passa os endereços de a e b. Assim, i aponta para a (desenhe uma seta de i para a) e j aponta para b (desenhe outra seta de b para j). Depois que os ponteiros são inicializados pela função call, *i é outro nome para a, e *j é outro nome para b. Agora execute o código em swap. Quando o código usa *i e *j, na verdade quer dizer a e b. Quando a função se completa, a e b foram trocados.
Suponha que você se esqueça do & quando a função swap é executada, e que a linha swap acidentalmente se pareça assim: swap(a, b);. Isso causa uma falha de segmentação. Quando você omite o &, o valor de a é passado em vez de seu endereço. Assim, i aponta para local inválido na memória e o sistema trava quando *i é usado.
É por isso também que scanf trava se você se esquecer do & em variáveis passadas a ele. A função scanf está usando ponteiro para colocar o valor que ele lê de volta à variável que você passou. Sem o &, scanf recebe um endereço inválido e trava.
Os parâmetros variáveis são um dos usos mais comuns de ponteiros em C. Agora você entende o que está acontecendo.