C Tutorial – Call by Value or Call by Reference
In this C language tutorial we will take a look at call by value and call by reference (also known as pass-by-value and pass-by-reference). These methods are different ways of passing (or calling) data to functions.
Call by Value
If data is passed by value, the data is copied from the variable used in for example main() to a variable used by the function. So if the data passed (that is stored in the function variable) is modified inside the function, the value is only changed in the variable used inside the function. Let’s take a look at a call by value example:
#include <stdio.h>
void call_by_value(int x) {
printf("Inside call_by_value x = %d before adding 10.\n", x);
x += 10;
printf("Inside call_by_value x = %d after adding 10.\n", x);
}
int main() {
int a=10;
printf("a = %d before function call_by_value.\n", a);
call_by_value(a);
printf("a = %d after function call_by_value.\n", a);
return 0;
}
The output of this call by value code example will look like this:
a = 10 before function call_by_value.
Inside call_by_value x = 10 before adding 10.
Inside call_by_value x = 20 after adding 10.
a = 10 after function call_by_value.
Ok, let’s take a look at what is happening in this call-by-value source code example. In the main() we create a integer that has the value of 10. We print some information at every stage, beginning by printing our variable a. Then function call_by_value is called and we input the variable a. This variable (a) is then copied to the function variable x. In the function we add 10 to x (and also call some print statements). Then when the next statement is called in main() the value of variable a is printed. We can see that the value of variable a isn’t changed by the call of the function call_by_value().
Call by Reference
If data is passed by reference, a pointer to the data is copied instead of the actual variable as is done in a call by value. Because a pointer is copied, if the value at that pointers address is changed in the function, the value is also changed in main(). Let’s take a look at a code example:
#include <stdio.h>
void call_by_reference(int *y) {
printf("Inside call_by_reference y = %d before adding 10.\n", *y);
(*y) += 10;
printf("Inside call_by_reference y = %d after adding 10.\n", *y);
}
int main() {
int b=10;
printf("b = %d before function call_by_reference.\n", b);
call_by_reference(&b);
printf("b = %d after function call_by_reference.\n", b);
return 0;
}
The output of this call by reference source code example will look like this:
b = 10 before function call_by_reference.
Inside call_by_reference y = 10 before adding 10.
Inside call_by_reference y = 20 after adding 10.
b = 20 after function call_by_reference.
Let’s explain what is happening in this source code example. We start with an integer b that has the value 10. The function call_by_reference() is called and the address of the variable b is passed to this function. Inside the function there is some before and after print statement done and there is 10 added to the value at the memory pointed by y. Therefore at the end of the function the value is 20. Then in main() we again print the variable b and as you can see the value is changed (as expected) to 20.
When to Use Call by Value and When to use Call by Reference?
One advantage of the call by reference method is that it is using pointers, so there is no doubling of the memory used by the variables (as with the copy of the call by value method). This is of course great, lowering the memory footprint is always a good thing. So why don’t we just make all the parameters call by reference?
There are two reasons why this is not a good idea and that you (the programmer) need to choose between call by value and call by reference. The reason are: side effects and privacy. Unwanted side effects are usually caused by inadvertently changes that are made to a call by reference parameter. Also in most cases you want the data to be private and that someone calling a function only be able to change if you want it. So it is better to use a call by value by default and only use call by reference if data changes are expected.
That is all for this C tutorial, where you (hopefully) have learned the difference between call-by-value and call-by-reference.
good tutorial . .
a nice tutorial, thanks.
very impressive..
a very good tutorial…thanks
thnks for the tutorial
this is really good. it helped me a lot. thank you very much.
really cool explained sufficiently its enough for beginer bt need more for intermediate
good
thanks a lottttt
I have really been helped, calling has been puzzling me 4 so long but now, the puzzling is all gone.
thanks
Thanks a lot. it helped me
Good tutorial
this was very helpfull, i got my assignment done, thanks alot
i hav this doubt for long time….
now its cleared
Thanks ……………..
its very useful……. very nice.. thankingh u soo much sir,who published this page … thank you so much
thanx………
very helpfull…
It’s easy to understand. Thank you !
thangs
very easy to understand explanation. thank you
nice
nice….
thanks a lot.
thnx
wow!
thank you
Thank you very much sir for sharing this concept
Thank you…………
good example with explaination
thanks a lot:)
Excellent
Thank you..
thanks for the notes
its very good explanation
gre8….very useful,,,thanx
thnkxx alot
thank you
Thanks.But its not enough for an intermediate person.So,i expect more.
thanx….
i dint get 10/10 in c programming internal… writing exactly point to point as given above !
i wonder what i should have added !!!
so nsweet of uu
thanks……
very clear with explanation..Excellent
clear cut explanations…..satisfied search..
thank u a lot… it was really helpful!!!!!!
up to the mark explaination ….
very good.
its clear now thanks hey!!
………..thanx alot for tutorial
i havebeen confusing wid this for the last 6 mnths..at last it gave me nice clarification…thanx for the awesome post..
This was very helpful for the preparation of my Assignment.. Thanks a lot..