Vou partir do princípio que todos sabem um pouco de linguagem C/C++ e que compreendem a forma de criação e utilização de funções. Também vou tentar escrever o mínimo possível e passar a ideia através de quatro exemplos muito simples, sempre à volta da clássica função troca.
Função Troca: recebe dois valores a e b, e troca os respectivos conteúdos.
Passagem de parâmetros por valor: A função recebe uma cópia da variável que é fornecida quando é invocada. Todas as alterações feitas dentro da função não vão afectar os valores originais.
Passagem de parâmetros por referência: Neste caso o que é enviado para a função é uma referência às variáveis utilizadas, e não uma simples cópia, pelo que as alterações realizadas dentro da função irão certamente alterar os valores contidos nessas variáveis.
Exemplo 1 – Passagem de parâmetros por valor – Linguagem C
#include<stdio.h>
void troca(int a, int b){
int temp;
temp=a;
a=b;
b=temp;
}
int main(){
int a=2,b=3;
printf("Antes de chamar a função :\na=%d\nb=%d\n",a,b);
troca(a,b);
printf("Depois de chamar a função:\na=%d\nb=%d\n",a,b);
return 0;
}
Apesar da troca dentro da função, os valores originais não sofreram alterações.
Exemplo 2 – Passagem de parâmetros por referência – Linguagem C
Contradizendo o título, em C só existe a passagem de parâmetros por valor (obrigatório o uso de apontadores).
#include<stdio.h>
void troca(int *a, int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main(){
int a=2,b=3;
printf("Antes de chamar a função :\na=%d\nb=%d\n",a,b);
troca(&a,&b);
printf("Depois de chamar a função:\na=%d\nb=%d\n",a,b);
return 0;
}
A troca dentro da função reflecte-se nos valores originais.
Exemplo 3 – Passagem de parâmetros por valor – Linguagem C++
#include<iostream>
using namespace std;
void troca(int a, int b){
int temp;
temp=a;
a=b;
b=temp;
}
int main(){
int a=2,b=3;
cout<<"Antes de chamar a função :\na="<<a<<"\nb="<<b<<endl;
troca(a,b);
cout<<"Depois de chamar a função :\na="<<a<<"\nb="<<b<<endl;
return 0;
}
Situação semelhante à apresentada no exemplo 1.
Exemplo 4 – Passagem de parâmetros por referência – Linguagem C++
#include<iostream>
using namespace std;
void troca(int &a, int &b){
int temp;
temp=a;
a=b;
b=temp;
}
int main(){
int a=2,b=3;
cout<<"Antes de chamar a função :\na="<<a<<"\nb="<<b<<endl;
troca(a,b);
cout<<"Depois de chamar a função :\na="<<a<<"\nb="<<b<<endl;
return 0;
}
Como se pode verificar, a evolução da linguagem C para C++ veio simplificar algumas tarefas:)




Setembro 8, 2008 ás 2:58 am
Em C não existe passagem por referência ou nao ?
Pois em C++ ele é um alias, mas em C ele seria um ponteiro para o endereço, quer dizer se apontar para NULL antes de realizar qualquer operação daria erro se quisesse fazer algo em seguida.
Setembro 8, 2008 ás 10:34 am
Na realidade não. Em C não existe.
O que se faz geralmente é simular a passagem de parâmetros por referência, recorrendo para o efeito aos apontadores, que é na mesma passagem de parâmetros por valor (mas de um endereço).
Acho que não estou a dizer asneiras!
Setembro 8, 2008 ás 7:37 pm
Citando “Luís Damas”, página 312, “Linguagem C – 8ª Edição ( http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&isbn=972-722-156-4 )
“Em C só existe passagem de parâmetros por valor.”
O exemplo 2 não passa de um “truque” para superar esta limitação, pelo que admito que o título escolhido não esteja tecnicamente correcto.
Novembro 12, 2008 ás 6:05 pm
qual a diferença por passagem por valor e por endereço??
Novembro 14, 2008 ás 2:15 pm
Mas ainda não existem valores por referencias para matrizes. Se vc declarar por exemplo void leitura(float &matriz[10][10]) o compilador nao compila sua aplicacao
Novembro 14, 2008 ás 2:58 pm
O nome de um array já é por si um apontador.
Por exemplo:
#include
using namespace std;
int main(){
int x[5] = { 1, 2, 3, 4 ,5};
cout << x[0] << endl;
cout << *x << endl;
cout << x[2] << endl;
cout << *x+2 << endl;
}
x[0] é o mesmo que *x
x[2] é o mesmo que *x+2
Nas funções vai ser preciso ter isto em conta.
Vou ver se tiro isso da matriz a limpo!
Maio 6, 2009 ás 11:38 pm
Apenas uma correção:
x[2] é o mesmo que *(x+2)
Maio 18, 2009 ás 10:22 pm
Boa ;)
Maio 12, 2009 ás 4:31 am
Na passagem de parametro por valor, o argumento passado é uma cópia da váriável original, dessa forma caso você altere a variável dentro do método, essa alteração não vai valer fora do método. Na passagem por referencia, alterações dentro do método são visiveis em quem chama a função.
Abraços.