Parameter Passing in C - Pointers, Addresses, Aliases
Could someone please explain the difference between parameter passing in C please? According to professor notes there are 4 different ways to pass parameters
- Call-by-value
- Call-by-address (pointer)
- Call-by-alias
- Global variable / Static variable
If you could please give an example, I would greatly appreciate that, and your work would be commended.
-
Call-by-value
Passing the value to a function as a parameter. If the function modifies the variable, the actual variable won't get changed.
void fun1(int myParam) { myParam = 4; } void main() { int myValue = 2; fun1(myValue); printf("myValue = %d",myValue); }
myValue
will always be 2. -
Call-by-address (pointer)
void fun1(int *myParam) { *myParam = 4; } void main() { int myValue = 2; fun1(&myValue); printf("myValue = %d",myValue); }
Here we are passing the address of
myValue
tofun1
. So the value ofmyValue
will be 4 at the end ofmain()
. -
Call-by-alias
There is no alias in C as per my understanding. It should be the C++ reference mechanism.
-
Global variable / Static variable
Global and static variables are variables stored in a common places, accessible by the caller and callee functions. So both caller and callee will be able to access and modify them.
int myValue = 2; void fun1() { myValue = 4; } void main() { myValue = 2 fun1(); printf("myValue = %d",myValue); }
As you can guess, the value of
myValue
will be 4 at the end ofmain()
.
Hope it helps.
C passes all function parameters by value, period; the formal parameter (in the definition) is a separate object in memory from the actual parameter (in the call). Any updates to the formal parameter have no effect on the actual parameter. You can fake pass-by-reference semantics by using a pointer, but the pointer is passed by value.
True pass-by-reference means that the formal and actual parameters refer to the same object in memory, so any changes to the formal parameter also affect the actual parameter. In practice, a pointer-like object is passed to the subroutine, but that's hidden from the programmer.
C does not support pass-by-reference. C++ supports pass-by-reference with special operators. Old-school Fortran was pass-by-reference.
Global variables are simply visible to both the caller and callee.
Can't speak to pass-by-name or pass-by-alias; never worked with a language that used that mechanism.