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.
  • Chamada 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 na linguagem Java.
  • 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.

Diferença entre Chamada por Valor e Chamada por Referência

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.

Exemplo de código Java 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
linguagens 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 complex expressões
  • 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.