What is the difference between call by value and call by reference in C language?


call by value

call by reference
In call by value, a copy of actual arguments is passed to formal arguments of the called function and any change made to the formal arguments in the called function have no effect on the values of actual arguments in the calling function.
In call by reference, the location (address) of actual arguments is passed to formal arguments of the called function. This means by accessing the addresses of actual arguments we can alter them within from the called function.
In call by value, actual arguments will remain safe, they cannot be modified accidentally.

Example using Call by Value

The classic example of wanting to modify the caller's memory is a swapByValue() function which exchanges two values. For C uses call by value, the following version of swap swapByValue() will not work...
#include <stdio.h>
 
void swapByValue(int, int); /* Prototype */
 
int main() /* Main function */
{
  int n1 = 10, n2 = 20;
 
  /* actual arguments will be as it is */
  swapByValue(n1, n2);
  printf("n1: %d, n2: %d\n", n1, n2);
}
 
void swapByValue(int a, int b)
{
  int t;
  t = a; a = b; b = t;
}
 
OUTPUT
======
n1: 10, n2: 20

In call by reference, alteration to actual arguments is possible within from called function; therefore the code must handle arguments carefully else you get unexpected results.

Example using Call by Reference

In call by reference, to pass a variable n as a reference parameter, the programmer must pass a pointer to n instead of n itself. The formal parameter will be a pointer to the value of interest. The calling function will need to use & to compute the pointer of actual parameter. The called function will need to dereference the pointer with * where appropriate to access the value of interest. Here is an example of a correct swap swapByReference() function. So, now you got the difference between call by value and call by reference!
#include <stdio.h>
 
void swapByReference(int*, int*); /* Prototype */
 
int main() /* Main function */
{
  int n1 = 10, n2 = 20;
 
  /* actual arguments will be altered */
  swapByReference(&n1, &n2);
  printf("n1: %d, n2: %d\n", n1, n2);
}
 
void swapByReference(int *a, int *b)
{
  int t;
  t = *a; *a = *b; *b = t;
}
 
OUTPUT
======
n1: 20, n2: 10

Comments

Popular posts from this blog

Area and Perimeter of circle program in c

Apply a motion path to text or an object

IP address