This blog is under construction

Monday, 7 October 2013

Difference between call by value and call by reference

Difference between pass by value and pass by reference

First Difference:
Call by value:  Value of the variable is passed as argument
Call by reference:  Address of the variable is passed as argument


  /* call by value vs call by reference */
  #include <stdio.h>

  void callByVal(int num) {
        num = 100;
        return;
  }

  void callByRef(int *num) {
        *num = 200;
        return;
  }

  int main() {
        int num = 10;
        printf("Call by value:\n");
        printf("Value of num before function call: %d\n", num);

        /* passing the value of the variable as argument */
        callByVal(num);

        printf("Value of num after function call: %d\n", num);
        printf("Call by reference:\n");
        printf("Value of num before function call: %d\n", num);

        /* passing address of the variable as argument */
        callByRef(&num);

        printf("Value of num after function call: %d\n", num);
        return 0;
  }



  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  Call by value:
  Value of num before function call: 10
  Value of num after function call: 10
  Call by reference:
  Value of num before function call: 10
  Value of num after function call: 200



Second Difference:
Call by value: Any change to the value of the argument in called function is not carried out to the calling function.
Call by reference:  Any change to the value of the argument in called function is carried out to the calling function.


  /* pass by value vs pass by reference */
  #include <stdio.h>

  void callByVal(int val) {
        /* trying to change the value of the argument */
        val = val + 10;
        return;
  }

  void callByRef(int *val) {
        /* changing the value of the argument */
        *val = *val + 10;
        return;
  }

  int main() {
        int val = 10;
        printf("Call by value:\n");
        printf("Value of val before function call: %d\n", val);

        /* passing the value of the valiable as argument */
        callByVal(val);

        /* call by value - value of val is not changed */
        printf("Value of val after function call: %d\n", val);

        printf("Call by reference:\n");
        printf("Value of val before function call: %d\n", val);

        /* passing address of the valiable as argument */
        callByRef(&val);

        /* call by reference - value of val is changed */
        printf("Value of val after function call: %d\n", val);
        return 0;
  }



  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  Call by value:
  Value of val before function call: 10
  Value of val after function call: 10
  Call by reference:
  Value of val before function call: 10
  Value of val after function call: 20


Third Difference:
Call by value: Memory occupied by actual and formal arguments are different.
Call by reference: Memory occupied by actual and formal arguments are same.


  /* call by value vs call by reference */
  #include <stdio.h>

  void callByVal(int val) {
        /* memory location of formal argument */
        printf("Address inside called function:\n");
        printf("Address of val: 0x%x\n", (int)&val);
        return;
  }

  void callByRef(int *val) {
        int tmp;
        /* memory location of formal argument */
        printf("Address inside called function:\n");
        printf("Pointer value of val: 0x%x\n", (int)val);
        return;
  }

  int main() {
        int val = 10;

        printf("\nCall by Value:\n");
        /* memory location of actual argument */
        printf("Address of the variables inside calling function:\n");
        printf("Address of val: 0x%x\n", (int)&val);
        callByVal(val);

        printf("\nCall by reference:\n");
        /* memory location of actual argument */
        printf("Address of the variables inside calling function:\n");
        printf("Address of val: 0x%x\n", (int)&val);
        callByRef(&val);

        return 0;

  }



  Output:
  jp@jp-VirtualBox:~/$ ./a.out
  Call by Value:
  Address of the variables inside calling function:
  Address of val: 0xbfed0e0c
  Address inside called function:
  Address of val: 0xbfed0df0

  Call by reference:
  Address of the variables inside calling function:
  Address of val: 0xbfed0e0c
  Address inside called function:
  Pointer value of val: 0xbfed0e0c


No comments:

Post a Comment