Diferença entre Chamada por Valor e Chamada por Referência
Diferença chave entre chamada por valor e chamada por referência
- No método Chamar por valor o valor original não é modificado, enquanto no método Chamar por referência o valor original é modificado.
- Em Chamada por valor, uma cópia da variável é passada, enquanto em Chamada por referência, uma variável em si é passada.
- Em Chamada por valor, os argumentos reais e formais serão criados em locais de memória diferentes, enquanto em Chamada por referência, os argumentos reais e formais serão criados no mesmo local de memória.
- Chamar por valor é o método padrão em linguagens de programação como C++, PHP, Visual Basic NET e C#, enquanto Chamada por referência é suportada apenas em Java língua.
- As variáveis Chamada por Valor são passadas usando um método direto, enquanto os ponteiros Chamada por Referência são necessários para armazenar o endereço das variáveis.
Nas linguagens de programação, as funções podem ser invocadas de duas maneiras: conhecida como Chamada por Valor e Chamada por Referência.
O que é o método Chamada por Valor?
O método Call by Value copia o valor de um argumento no parâmetro formal dessa função. Portanto, as alterações feitas no parâmetro da função principal não afetam o argumento.
Neste método de passagem de parâmetros, os valores dos parâmetros reais são copiados para os parâmetros formais da função e os parâmetros são armazenados em diferentes locais de memória. Portanto, quaisquer alterações feitas dentro das funções não são refletidas nos parâmetros reais do chamador.
O que é o método Chamada por Referência?
O método de chamada por referência copia o endereço de um argumento no parâmetro formal. Neste método, o endereço é usado para acessar o argumento real usado na chamada da função. Isso significa que as alterações feitas no parâmetro alteram o argumento de passagem.
Neste método, a alocação de memória é igual aos parâmetros reais. Todas as operações na função são realizadas no valor armazenado no endereço do parâmetro real, e o valor modificado será armazenado no mesmo endereço.
Exemplo de código C de um método Call by Value
void main() { int a = 10, void increment(int); Cout << "before function calling" << a; increment(a); Cout << "after function calling" << a; getch(); void increment(int x) { int x = x + 1; Cout << "value is" << x; }
Saída:
before function calling 10 value is 11 after function calling 1-0
Porque a variável declarada 'a' em main() é diferente da variável 'x' em increment(). Neste programa apenas os nomes das variáveis são semelhantes, mas seus endereços de memória são diferentes e armazenados em locais de memória diferentes.
Java Exemplo de código de um método de chamada por referência
Public static void main(string args[]) { int a = 10; System.out.println("Before call Value of a = ", a); Void increment(); System.out.println("After call Value of a = ", a); } Void increment(int x) { int x = x + 1; }
Saída:
Before call Value of a =10 After call Value of a =11
Porque a variável declarada 'a' está referenciando/apontando para a variável 'a' em main(). Aqui o nome da variável é diferente, mas ambos apontam/referem-se aos mesmos locais de endereço de memória.
Chamada por valor vs. Chamada por referência
parâmetros | Chamada por valor | Chamada por referência |
---|---|---|
Definição | Ao chamar uma função, quando você passa valores copiando variáveis, isso é conhecido como “Chamada por Valores”. | Ao chamar uma função, em linguagem de programação ao invés de copiar os valores das variáveis, utiliza-se o endereço das variáveis, conhecido como “Chamada por Referências. |
Argumentos | Neste método, uma cópia da variável é passada. | Neste método, uma variável em si é passada. |
Efeito | As alterações feitas em uma cópia da variável nunca modificam o valor da variável fora da função. | A mudança na variável também afeta o valor da variável fora da função. |
Alteração de valor | Não permite fazer alterações nas variáveis reais. | Permite fazer alterações nos valores das variáveis usando chamadas de função. |
Passagem de variável | Os valores das variáveis são passados usando um método direto. | Variáveis de ponteiro são necessárias para armazenar o endereço das variáveis. |
Modificação de valor | Valor original não modificado. | O valor original é modificado. |
Localização de memória | Argumentos reais e formais será criado em diferentes localização da memória |
Argumentos reais e formais será criado no mesmo localização da memória |
Segurança | Argumentos reais permanecem seguros, pois não podem ser modificados acidentalmente. |
Os argumentos reais não são Seguro. Eles podem ser modificado acidentalmente, então você precisa lidar com as operações de argumentos com cuidado. |
Padrão | Padrão em muitas programações idiomas como C++.PHP. Visual BasicNET e C#. |
É apoiado pela maioria linguagens de programação como JAVA, mas não como padrão. |
Vantagens de usar o método Call by value em C
Prós/benefícios de uma chamada por valor em C:
- O método não altera a variável original, portanto preserva os dados.
- Sempre que uma função é chamada, nunca afete o conteúdo real dos argumentos reais.
- Valor dos argumentos reais passados para os argumentos formais, portanto, quaisquer alterações feitas no argumento formal não afetam os casos reais.
Vantagens de usar o método Chamada por referência
Prós de usar o método de chamada por referência:
- A função pode alterar o valor do argumento, o que é bastante útil.
- Ele não cria dados duplicados para armazenar apenas um valor, o que ajuda a economizar espaço de memória.
- Neste método, não há cópia do argumento feita. Portanto, é processado muito rapidamente.
- Ajuda você a evitar alterações feitas por engano
- Quem lê o código nunca sabe que o valor pode ser modificado na função.
Desvantagens de usar o método Call by value
Aqui estão os principais contras/desvantagens de um método de chamada por valor:
- Mudanças nos parâmetros reais também podem modificar variáveis de argumento correspondentes
- Neste método, os argumentos devem ser variáveis.
- Você não pode alterar diretamente uma variável no corpo de uma função.
- Às vezes, o argumento pode ser expressões complexas
- Existem duas cópias criadas para a mesma variável que não consomem muita memória.
Desvantagens de usar o método Chamar por referência
Aqui estão os principais contras do uso do método de chamada por referência:
- Garantia forte não nula. Uma função que recebe uma referência precisa ter certeza de que a entrada não é nula. Portanto, a verificação de nulo não precisa ser feita.
- Passar por referência faz com que a função não seja pura teoricamente.
- Uma garantia vitalícia é um grande problema com referências. Isso é especificamente perigoso ao trabalhar com lambdas e programas multithread.