Unit 5: C Pointers
Unit 5: C Pointers
C Pointers
Introduction to C Pointer
Pointers in C are easy and fun to learn. Some C programming
memory location has its address defined which can be accessed using
type *var-name;
Here, type is the pointer's base type; it must be a valid C data type and var-
name is the name of the pointer variable. The asterisk * you used to declare
a pointer is the same asterisk that you use for multiplication. Following are
the valid pointer declaration:
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch ; /* pointer to a character */
How to use Pointers?
There are few important operations, which we will do with
the help of pointers very frequently.
When the above code is compiled and executed, it produces result something as
follows:
Address of var[0] = bfdbcb20
Value of var[0] = 10
Address of var[1] = bfdbcb24
Value of var[1] = 100
Address of var[2] = bfdbcb28
Value of var[2] = 200
Array of pointers
Before we understand the concept of arrays of pointers, let us consider the following
example, which makes use of an array of 3 integers:
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i;
for (i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, var[i] );
}
return 0;
}
Array of pointers Cont..
When the above code is compiled and executed, it produces the following result:
Value of var[0] = 10
There may be a situation when we want to maintain an array, which can store pointers
to an int or char or any other data type available. Following is the declaration of an
array of pointers to an integer:
int *ptr[MAX];
This declares ptr as an array of MAX integer pointers. Thus, each element in ptr, now
holds a pointer to an int value.
Array of pointers Cont..
Following example makes use of three integers, which will be stored in
an array of pointers as follows:
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* assign the address of integer. */
}
for ( i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, *ptr[i] );
}
return 0;
}
Array of pointers Cont..
When the above code is compiled and executed, it produces the following result:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
You can also use an array of pointers to character to store a list of strings as follows:
#include <stdio.h>
const int MAX = 4;
int main ()
{
char *names[] = {
“Amit Deshmukh",
“Sunil Deshmukh",
“Sumit Deshmukh",
“Rahul Deshmukh",
};
int i = 0;
Array of pointers Cont..
for ( i = 0; i < MAX; i++)
{
printf("Value of names[%d] = %s\n", i, names[i] );
}
return 0;
}
When the above code is compiled and executed, it produces the following result:
When we define a pointer to a pointer, the first pointer contains the address
of the second pointer, which points to the location that contains the
actual value as shown below.
int **var;
#include <stdio.h>
#include <time.h>
int main ()
{
/* get the current number of seconds */
return;
When the above code is compiled and executed, it produces the following result:
Number of seconds :1294450468
Passing pointers to functions Cont..
The function, which can accept a pointer, can also accept an array as shown in
the following example:
#include <stdio.h>
/* function declaration */
double getAverage(int *arr, int size);
int main ()
{
/* an int array with 5 elements */
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
/* pass pointer to the array as an argument */
avg = getAverage( balance, 5 ) ;
/* output the returned value */
printf("Average value is: %f\n", avg );
return 0; }
Passing pointers to functions Cont..
double getAverage(int *arr, int size)
int i, sum = 0;
double avg;
sum += arr[i];
return avg;
}
When the above code is compiled together and executed, it produces the following
result: Average value is: 214.40000
Return pointer from functions
As we have seen in last unit how C programming language allows to return an
array from a function, similar way C allows you to return a pointer from a function.
To do so, you would have to declare a function returning a pointer as in the following
example:
int * myFunction()
{.
}
Second point to remember is that, it is not good idea to return the address of a
local variable to outside of the function so you would have to define the local
variable as static variable.
Return pointer from functions Cont..
Now, consider the following function, which will generate 10 random numbers and
returns them using an array name which represents a pointer, i.e., address of first array
element.
#include <stdio.h>
#include <time.h>
int * getRandom( )
int i;
r[i] = rand();
printf("%d\n", r[i] );
return r;
int main ()
/* a pointer to an int */
int *p;
int i;
Return pointer from functions Cont..
p = getRandom();
return 0;
}
When the above code is compiled together and executed, it produces result
something as follows:
1523198053
1187214107
1108300978
430494959
Return pointer from functions Cont..
1421301276
930971084
123250484
106932140
1604461820
149169022
*(p + [0]) : 1523198053
*(p + [1]) : 1187214107
*(p + [2]) : 1108300978
*(p + [3]) : 430494959
*(p + [4]) : 1421301276
*(p + [5]) : 930971084
*(p + [6]) : 123250484
*(p + [7]) : 106932140
*(p + [8]) : 1604461820
*(p + [9]) : 149169022
Pointer to an Array
An array name is a constant pointer to the first element of the array.
Therefore, in the declaration:
double balance[50];
balance is a pointer to &balance[0], which is the address of the first element of
the array balance. Thus, the following program fragment assigns p the address of
the first element of balance:
double *p;
double balance[10];
p = balance;
It is legal to use array names as constant pointers. Therefore, *(balance + 4) is a valid
way of accessing the data at balance[4].
Pointer to an Array Cont..
Once you store the address of first element in p, you can access array elements using
*p, *(p+1), *(p+2) and so on. Below is the example to show all the concepts discussed
above:
#include <stdio.h>
int main ()
{
/* an array with 5 elements */
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double *p;
int i;
p = balance;
/* output each array element's value */
printf( "Array values using pointer\n");
Pointer to an Array Cont..
for ( i = 0; i < 5; i++ )
{
printf("*(p + %d) : %f\n", i, *(p + i) );
}
printf( "Array values using balance as address\n");
for ( i = 0; i < 5; i++ )
{
printf("*(balance + %d) : %f\n", i, *(balance + i) );
}
return 0;
}
Pointer to an Array Cont..
When the above code is compiled and executed, it produces the following result:
Array values using pointer
*(p + 0) : 1000.000000
*(p + 1) : 2.000000
*(p + 2) : 3.400000
*(p + 3) : 17.000000
*(p + 4) : 50.000000
Array values using balance as address
*(balance + 0) : 1000.000000
*(balance + 1) : 2.000000
*(balance + 2) : 3.400000
*(balance + 3) : 17.000000
*(balance + 4) : 50.000000
In the above example, p is a pointer to double, which means it can store address of a variable of
double type. Once we have address in p, then *p will give us value available at the address stored in p, as we
have shown in the above example.