Problema: escrever um procedimento que troca os valores de duas variáveis.
A peculiaridade dessa tarefa é que precisamos que as alterações feitas no procedimento se tornem conhecidas pelo programa chamador.
Vamos tentar escrever o procedimento assim:
var x, y: inteiro;
procedimento Swap(a, b: inteiro); // com tal descrição dos parâmetros do procedimento,
var c: inteiro;
begin // irá copiar os valores dos argumentos (x e y)
// variáveis a e b são variáveis independentes não relacionadas a x e y
c := a;
a := b;
b := c;
fim;
começar
x := 1;
y := 2;
Trocar(x, y); //valores das variáveis x e y (argumentos) são copiados nos parâmetros a e b
writeln('x = ', x, ', y = ', y); // x=1, y=2
fim.
Se você executar este programa, poderá ver que os valores das variáveis x e y não foram alterados. Para que os parâmetros alterem os valores dos argumentos, deve-se utilizar passagem de dados por referência. Para isso, após o nome do tipo de dado no cabeçalho da sub-rotina, você deve colocar a palavra var
procedimento Swap(var a, b: integer); // agora as variáveis a e b obtêm os endereços das variáveis x e y na memória
var c: inteiro;
começar
c := a;
a := b;
b := c;
fim;
Uso: Se você passar um argumento por referência, somente o nome da variável (NÃO um número e NÃO uma expressão aritmética) pode estar neste local ao chamar o procedimento!< br />
NÃO chame um procedimento como este:
Swap(x, 4);
Swap(5+x, y);