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 ValueThe classic example of wanting to modify the caller's memory is aswapByValue() 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 ReferenceIn call by reference, to pass a variablen 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
Post a Comment