© Miha Creative/Shutterstock.com

Muitos programadores novatos se perguntam se sua linguagem de programação é uma linguagem “passada por valor” ou “passada por referência”. Para entender que tipo de linguagem você está usando, você deve primeiro entender o que esses termos significam.

Simplificando, as linguagens de passagem por valor usam uma cópia de um valor armazenado na memória. As linguagens de passagem por referência referenciam o valor real na memória em vez de criar uma cópia.

Vamos dê uma olhada nas diferenças entre as linguagens de passagem por referência e passagem por valor.

Passagem por valor vs. Passagem por referência: comparação lado a lado

Pass-by-ValuePass-by-ReferenceValue Storage LocationMemoryMemoryValue Retrieval MethodCopy of Memory ValueReference to Memory Value LocationExample of Language Based on MethodJavaVariousOther NamesNonePass-By-Address

Pass-By-Value vs. Pass-By-Referência: Qual é a diferença?

Agora, uma coisa crucial a lembrar é que, neste ponto, passagem por valor e passagem por referência são consideradas distinções desatualizadas. Isso significa que você não precisa mais se preocupar se suas funções são passadas por valor ou passadas por referência. Saber a diferença entre eles agora é um conhecimento esotérico que não será muito útil em aplicativos de programação práticos.

Muitas linguagens ainda em uso hoje foram projetadas para usar passagem por valor ou passagem por valor referência e pode ter funções adicionais para iniciar uma passagem por valor ou passagem por referência. Ainda assim, você não precisa mais se preocupar com a função escolhida. Eles são funcionalmente a mesma coisa agora.

Ainda assim, saber a diferença entre passagem por valor e passagem por referência pode ter alguns usos. Então, vamos dar uma olhada nas diferenças funcionais entre eles.

Funções de chamada

A diferença mais significativa entre passagem por valor e passagem por referência é como eles chamam funções. As funções de chamada usam argumentos que o usuário fornece no código. Referimo-nos às funções chamadas pelos argumentos como sendo o “chamado” e a função que chama os argumentos é o “chamador”. Os valores passados ​​pelo chamador e pelo receptor são conhecidos como “parâmetros reais”. Os valores recebidos pela função são chamados de “parâmetros formais.”

Ao usar passagem por valor, uma cópia dos parâmetros reais é feita na memória do computador e depois passada para a função como seus parâmetros formais. Quaisquer alterações feitas nos parâmetros formais são vistas apenas pelo chamador e são invisíveis para o chamador porque o chamador e o chamado têm cópias independentes do valor do parâmetro real. Isso também significa que alterações nos parâmetros formais não alteram os parâmetros reais na memória.

As funções de passagem por referência farão referência ao valor real na memória do computador. Isso significa que o chamador e o chamado usam o mesmo valor não independente ao fazer referência a esse local na memória. Isso também significa que quaisquer alterações feitas nos parâmetros formais serão visíveis tanto para o chamador quanto para o receptor, pois quaisquer alterações nos parâmetros formais serão feitas usando a referência aos parâmetros reais na memória.

Quando usar Pass-by-value

As funções pass-by-value são mais bem utilizadas ao criar um aplicativo multi-threaded. A razão pela qual os aplicativos multithread usam melhor a passagem por valor é que, quando um aplicativo usa a passagem por valor, isso impede que os outros threads de seu aplicativo modifiquem os parâmetros formais usados ​​por sua função. Suponha que outras threads possam modificar seus parâmetros formais. Nesse caso, você corre o risco de suas funções quebrarem quando receberem parâmetros errados. Portanto, passar as informações por valor permite que cada thread use um parâmetro formal independente, evitando que as funções interfiram umas nas outras.

Além disso, passar informações por valor em um aplicativo distribuído pode economizar a sobrecarga da rede e permitir para funcionar com mais eficiência. Você também pode precisar passar por valor se estiver usando uma linguagem como Java, que se concentra na passagem por valor.

Embora a maioria das linguagens modernas permita tanto a passagem por valor quanto a passagem por referência, algumas linguagens preferem uma em detrimento da outra. Portanto, você deve garantir que o idioma escolhido suporte a chamada de função que deseja usar.

Dependendo do que você está construindo e do uso de suas informações, a passagem por valor ou a passagem por referência pode ser usada.

©DC Studio/Shutterstock.com

Quando usar passagem por referência

Passar por referência economiza a sobrecarga de copiar o valor; o programa não precisa copiar o valor e esse tempo de processamento é economizado. Assim, ao transferir grandes quantidades de dados e estrutura, é muito mais eficiente usar a passagem por referência se você tiver a opção.

Você desejará usar a passagem por referência sempre que desejar para usar a função de chamada para modificar os parâmetros reais. Por exemplo, esse método é útil em aplicativos que precisam alterar o valor do argumento na função de chamada. Também é mais eficiente em termos de tempo, portanto, os aplicativos que podem usar o tempo extra podem considerar a passagem por referência.

Demonstrando a passagem por valor usando as funções swap() e changeValue() do Java

Muitos programadores novatos se perguntam se as linguagens que eles usam usam principalmente passagem por valor ou passagem por referência. Java é uma linguagem que normalmente usa passagem por valor, se não sempre.

Começaremos definindo uma classe para gatos e depois demonstraremos a passagem por valor alterando a cor do gato.

public class Cat { private String color; public Cat() {} public Cat(String c) { this.color=c; } public String getColor() { return cor; } public void setColor(String color) { this.color=color; } }

Podemos criar um programa usando a função swap() para mudar a cor do gato de forma que as duas variáveis ​​— aquela na memória e a cópia usada pelo programa — sejam diferentes.

public class Test { public static void main(String[] args) { Cat ginger=new Cat(“Ginger”);//referência de memória=50 Cat calico=new Cat(“Calico”);//referência de memória=100 swap(ginger, chita); System.out.println(“Após a execução do método swap:”); System.out.println(“valor da cor `ginger`=”+ red.getColor()); System.out.println(“valor da cor `calico`=”+ blue.getColor()); changeValue(chita); System.out.println(“Após a execução do método changeValue:”); System.out.println(“valor da cor `calico`=”+ blue.getColor()); }//Método de troca genérico public static void swap(Object o1, Object o2){ Object temp=o1; o1=o2; o2=temperatura; } private static void changeValue(Cat cat) {//cat=100 cat.setColor(“ginger”);//gato=100 gato=new Gato(“concha de tartaruga”);//balão=200 cat.setColor(“calico”);//balão=200 } }

A execução deste código resultará no seguinte:

Após a execução do método de troca:

‘ginger’color value=Ginger

‘calico’color value=Calico

Após a execução do método changeValue:

‘calico’color value=Ginger

Como o método swap() não Se você não alterar os valores originais, apenas as cópias dos valores, você terá dois valores listados como o mesmo local de memória.

Este exercício demonstra que Java normalmente usa uma metodologia de passagem por valor. No entanto, você pode usar a função changeValue() para alterar os valores armazenados na memória.

Demonstrando a passagem por referência usando swapnum() do C++

Podemos demonstrar a passagem por referência usando C++. A função swapnum() é um exemplo de modificação de dados passados ​​por referência.

#include void swapnum(int &i, int &j) { int temp=i; i=j; j=temperatura; } int main(void) { int a=10; int b=20; swapnum(a, b); printf(“A é %d e B é %d\n”, a, b); retornar 0; }

A execução deste código resultará em uma saída do seguinte:

A é 20 e B é 10

Este código age sobre a localização dos dados na memória em vez de criando uma cópia dos dados. Portanto, quando o código troca os números, ele faz com que a saída de dados mude para refletir os novos locais dos dados dentro do programa, resultando na troca dos valores de A e B no nível básico da memória.

Considerações Finais

Passar por valor e passar por referência podem ser conceitos desatualizados. No entanto, ainda é bom cobrir suas bases e entender as maquinações internas do idioma que você está usando. Esteja você usando uma linguagem que usa principalmente passagem por valor ou passagem por referência, você poderá acessar e modificar seus parâmetros mais rapidamente se entender qual método deseja usar melhor.

Algumas linguagens, como Java, podem usar passagem por valor exclusivamente, mas outras, como C++, podem exigir que você passe por referência. Portanto, faz sentido querer entender esses conceitos se você planeja aprender vários idiomas.

Passar por valor x Passar por referência: qual é a diferença? FAQs (Perguntas Frequentes) 

O que é passagem por valor?

Passagem por valor é um método de recuperação de informações armazenadas no computador memória copiando os dados para um valor independente.

O que é passagem por referência?

Passagem por referência é um método de recuperação de informações armazenados na memória do computador referenciando diretamente a localização dos dados na memória do computador.

Quais linguagens usam a passagem por valor principalmente?

Java é uma linguagem que quase exclusivamente usa passagem por valor ao recuperar dados da memória.

Quais linguagens usam passagem por referência principalmente?

C++ passa principalmente dados da memória para um programa por referência.

A passagem por valor é melhor que a passagem por referência?

Nos dias modernos , esses dois tipos de função são quase sinônimos e não requerem conhecimento íntimo de suas diferenças.

By Maxwell Gaven

Trabalho com TI há 7 anos. É divertido observar a constante mudança no setor de TI. TI é meu trabalho, hobby e vida.