Skillnaden mellan Call by Value och Call by Reference

Nyckelskillnad mellan Call by Value och Call by Reference

  • I Call by value-metoden ändras inte det ursprungliga värdet, medan det ursprungliga värdet ändras i Call by reference-metoden.
  • I Call by value skickas en kopia av variabeln, medan i Call by reference skickas en variabel själv.
  • I Call by value kommer faktiska och formella argument att skapas på olika minnesplatser, medan i Call by reference skapas faktiska och formella argument på samma minnesplats.
  • Call by value är standardmetoden i programmeringsspråk som C++, PHP, Visual Basic NET och C#, medan Call by reference endast stöds i Java språk.
  • Call by Value-variabler skickas med en enkel metod, medan Call by Reference-pekare krävs för att lagra adressen till variabler.

Skillnaden mellan Call by Value och Call by Reference

I programmeringsspråk kan funktioner anropas på två sätt: vilket är känt som Call by Value och Call by Reference.

Vad är Call by Value-metoden?

Call by value-metoden kopierar värdet av ett argument till den formella parametern för den funktionen. Därför påverkar ändringar som görs av parametern för huvudfunktionen inte argumentet.

I denna parameteröverföringsmetod kopieras värden för faktiska parametrar till funktionens formella parametrar, och parametrarna lagras på olika minnesplatser. Så alla ändringar som görs inuti funktioner återspeglas inte i faktiska parametrar för den som ringer.

Vad är Call by Reference-metoden?

Call by reference-metoden kopierar adressen till ett argument till den formella parametern. I denna metod används adressen för att komma åt det faktiska argumentet som används i funktionsanropet. Det betyder att ändringar som görs i parametern ändrar det godkända argumentet.

I denna metod är minnesallokeringen densamma som de faktiska parametrarna. Alla operationer i funktionen utförs på värdet lagrat på adressen för den aktuella parametern, och det ändrade värdet kommer att lagras på samma adress.

C-kod Exempel på en Call by Value-metod

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;
        }

Produktion:

before function calling 10
value is 11
after function calling 1-0

Eftersom variabel deklarerad 'a'in main() skiljer sig från variabel 'x' i inkrement(). I detta program är endast variabelnamn lika, men deras minnesadress är olika och lagras på olika minnesplatser.

Java Kodexempel på en Call by Reference-metod

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;
}

Produktion:

Before call Value of a =10
After call Value of a =11

Eftersom variabel deklarerad 'a' i refererar/pekar till variabel 'a' i main(). Här är variabelnamnet olika, men båda pekar/refererar till samma minnesadressplatser.

Call by Value vs Call by Reference

Driftparametrar Ring efter värde Ring med referens
Definition När du anropar en funktion, när du skickar värden genom att kopiera variabler, kallas den "Call By Values". När du anropar en funktion, i programmeringsspråk istället för att kopiera värdena för variabler, används adressen till variablerna, den kallas "Call By References.
Argument I denna metod skickas en kopia av variabeln. I denna metod skickas en variabel själv.
Effekt Ändringar som görs i en kopia av variabel ändrar aldrig värdet på variabel utanför funktionen. Ändring i variabeln påverkar även värdet på variabeln utanför funktionen.
Värdeförändring Tillåter inte att du gör några ändringar i de faktiska variablerna. Låter dig göra ändringar i variablernas värden genom att använda funktionsanrop.
Passering av variabel Variablers värden skickas med en enkel metod. Pekarvariabler krävs för att lagra adressen till variabler.
Värdeförändring Ursprungligt värde inte ändrat. Det ursprungliga värdet ändras.
Minnesplats Faktiska och formella argument
kommer att skapas i olika
minnesplats
Faktiska och formella argument
kommer att skapas i samma
minnesplats
Säkerhet Faktiska argument kvarstår
säkra eftersom de inte kan modifieras
av misstag.
Faktiska argument är det inte
Säker. De kan vara
ändras av misstag, så du måste hantera argumentoperationer noggrant.
Standard Standard i många programmeringar
språk som C++.PHP. Visual Basic NET och C#.
Det stöds av de flesta
programmeringsspråk som JAVA, men
inte som standard.

Fördelar med att använda Call by value-metoden i C

Fördelar/fördelar med ett samtal efter värde i C:

  • Metoden ändrar inte den ursprungliga variabeln, så den bevarar data.
  • Närhelst en funktion kallas den, påverka aldrig det faktiska innehållet i de faktiska argumenten.
  • Värdet av faktiska argument som överförs till de formella argumenten, så eventuella ändringar som görs i det formella argumentet påverkar inte de verkliga fallen.

Fördelar med att använda Call by reference-metoden

Fördelar med att använda call by reference-metoden:

  • Funktionen kan ändra värdet på argumentet, vilket är ganska användbart.
  • Det skapar inte dubbletter av data för att bara hålla ett värde vilket hjälper dig att spara minnesutrymme.
  • I denna metod finns det ingen kopia av argumentet. Därför bearbetas det mycket snabbt.
  • Hjälper dig att undvika ändringar gjorda av misstag
  • En person som läser koden vet aldrig att värdet kan ändras i funktionen.

Nackdelar med att använda Call by value-metoden

Här är stora nackdelar/nackdelar med en call by value-metod:

  • Ändringar av faktiska parametrar kan också ändra motsvarande argumentvariabler
  • I denna metod måste argument vara variabler.
  • Du kan inte direkt ändra en variabel i en funktionskropp.
  • Ibland kan argument vara komplexa uttryck
  • Det finns två kopior skapade för samma variabel som inte är minneseffektiva.

Nackdelar med att använda Call by reference-metoden

Här är de stora nackdelarna med att använda call by reference-metoden:

  • Stark icke-nullgaranti. En funktion som tar in en referens måste se till att ingången inte är noll. Därför behöver ingen nollkontroll göras.
  • Att passera genom referens gör att funktionen inte är rent teoretiskt.
  • Livstidsgaranti är ett stort problem med referenser. Detta är särskilt farligt när man arbetar med lambdas och flertrådade program.