Pointers And Functions

The arguments (or) parameters to the functions are passed in two ways:

1. Call by value.
2. Call by reference.

Call by value:

In call by value, the values of the variables are passed. In this value of variable are not affected by changing the value of formal arguments

Program:

```#include<stdio.h>
#include<conio.h>
void main()
{
int a=5, b=8;
clrscr();
printf(“ before fn. Call a & b are %d & %d \n”, a, b);
value(a, b);
Printf (“after fn. Call a& bare %d & %d \n”, a,b);
}

void value(p, q)
{
int p, q;
p++;
q++;
printf(“In fn., changes are %d & %d \n “, p, q);
}
```

O/P:
Before fn.call a & b are 5 & 8.
In fn., changes are 6, 9.
After fn. Call a & b are 5 & 8.

EXPLANATION:
Before calling the function value (), the value of a=5 & b=8. The variables a&b are passed as the parameter in the function value (). The values of a & b are passed to ‘p’ and ‘q’. But memory locations are different from the memory location of a & b. hence when the values of ‘p’ & ‘q’ are incremented, there will be no effect on the value of ‘a’ & ‘b’. So, after calling the function ‘a’ and ‘b’ are same as before calling the function and has the value 5 & 8.

CALL BY REFERENCE

In call by reference, the addresses of the variables are passed. When we pass addresses to a function, the parameters receiving the addresses should be pointers. The process of calling a function using pointers to pass the addresses of a variable is known as ‘call by reference’.
PROGRAM:

```#include<stdio.h>
#include<conio.h>
Void main()
{
int a=5, b=8;
clrscr();
printf (“before calling function a and b are %d and %d \n”,a, b);
ref (&a, &b);

printf (“after calling the function a and b are %d & %d \n”,a,b);
getch();
}
void ref (p, q)
Int *p, *q;
{
(*p)++;
(*q)++;
printf (“in function, changes are %d & %d \n”,*p,*q);
}
```

EXPLANATION:
Before calling the function ref (), the value of a=5, b=8. The address of the variables a and b are passed as parameters in the function ref (). The address of a and b are passed to p and q, which is a pointer variable. (*p)++ means value at address is incremented. So the value at address of a, i.e., 5 is incremented, similarly (*q) ++ means value at address of b i.e., 8 is incremented. Now the value *p=6, *q=9.

Here the address is not changed, but value at this address is changed. Hence after calling the function the values of the variables a and b are changed.