Pointers
Pointers
1
Introduction
• A pointer is a variable that represents the location (rather than
the value) of a data item.
• They have a number of useful applications.
– Enables us to access a variable that is defined outside the function.
– Can be used to pass information back and forth between a function and
its reference point.
– More efficient in handling data tables.
– Reduces the length and complexity of a program.
– Sometimes also increases the execution speed.
– To return more than one value from function
– Implementing complex data structure such as linked list, graph, trees &
many other data structure which contains reference to other data
structure
– To allocate memory & access it (dynamic memory allocation)
– To manipulate array more easily by moving pointers to them instead of
moving the array themselves
2
Basic Concept
3
Contd.
xyz ➔ variable
50 ➔ value
1380 ➔ address
4
Contd.
• During execution of the program, the system
always associates the name xyz with the
address 1380.
– The value 50 can be accessed by using either the
name xyz or the address 1380.
• Since memory addresses are simply numbers,
they can be assigned to some variables which
can be stored in memory.
– Such variables that hold memory addresses are
called pointers.
– Since a pointer is a variable, its value is also stored
in some memory location.
5
Contd.
int arr[20];
:
&arr;
• Pointing at array name.
&(a+b)
• Pointing at expression.
8
Example
#include <stdio.h>
main()
{
int a;
float b, c;
double d;
char ch;
9
Output:
10
Pointer Declarations
• Pointer variables must be declared before we
use them.
• General form:
data_type *pointer_name;
Three things are specified in the above
declaration:
1. The asterisk (*) tells that the variable pointer_name is a
pointer variable.
2. pointer_name needs a memory location.
3. pointer_name points to a variable of type data_type.
Data type is a type of object which the pointer is pointing
11
Contd.
• Example:
int *count;
float *speed;
• Once a pointer variable has been declared, it
can be made to point to a variable using an
assignment statement like:
int *p, xyz;
:
p = &xyz;
– This is called pointer initialization.
12
Things to Remember
#include <stdio.h>
main()
{
int a, b;
int c = 5; Equivalent
int *p;
a = 4 * (c + 5) ;
p = &c;
b = 4 * (*p + 5) ;
printf (“a=%d b=%d \n”, a, b) ;
}
16
Example 2
#include <stdio.h>
main()
{
int x, y; *&xx
int *ptr;
x = 10 ;
ptr=&x;
ptr = &x ; &x&*ptr
y = *ptr ;
printf (“%d is stored in location %u \n”, x, &x) ;
printf (“%d is stored in location %u \n”, *&x, &x) ;
printf (“%d is stored in location %u \n”, *ptr, ptr) ;
printf (“%d is stored in location %u \n”, y, &*ptr) ;
printf (“%u is stored in location %u \n”, ptr, &ptr) ;
printf (“%d is stored in location %u \n”, y, &y) ;
*ptr = 25;
printf (“\nNow x = %d \n”, x);
}
17
Output: Address of x: 3221224908
Address of y: 3221224904
Now x = 25
18
Pointer Expressions
19
20
21
Contd.
• What are allowed in C?
– Add an integer to a pointer.
– Subtract an integer from a pointer.
– Subtract one pointer from another (related).
• If p1 and p2 are both pointers to the same array, them
p2–p1 gives the number of elements between p1 and p2.
• What are not allowed?
– Add two pointers.
p1 = p1 + p2 ;
– Multiply / divide a pointer in an expression.
p1 = p2 / 5 ;
p1 = p1 – p2 * 10 ;
22
Scale Factor
• We have seen that an integer value can be
added to or subtracted from a pointer variable.
int *p1, *p2 ;
int i, j;
:
p1 = p1 + 1 ;
p2 = p1 + j ;
p2++ ;
p2 = p2 – (i + j) ;
• In reality, it is not the integer value which is
added/subtracted, but rather the scale factor
times the value.
23
24
Contd.
25
Example:
Returns to required
no. of bytes find theforscale factors
data type representation
#include <stdio.h>
main()
{
printf (“Number of bytes occupied by int is %d \n”, sizeof(int));
printf (“Number of bytes occupied by float is %d \n”, sizeof(float));
printf (“Number of bytes occupied by double is %d \n”, sizeof(double));
printf (“Number of bytes occupied by char is %d \n”, sizeof(char));
}
Output:
26
Passing Pointers to a Function
• Pointers are often passed to a function as
arguments.
– Allows data items within the calling program to be
accessed by the function, altered, and then returned
to the calling program in altered form.
– Called call-by-reference (or by address or by
location).
• Normally, arguments are passed to a function
by value.
– The data items are copied to the function.
– Changes are not reflected in the calling program.
27
Example: passing arguments by value
#include <stdio.h>
main()
{ a and b
int a, b; do not
a = 5 ; b = 20 ; swap
swap (a, b) ; Output
printf (“\n a = %d, b = %d”, a, b);
} a = 5, b = 20
int x, y ;
printf (“%d %d %d”, x, y, x+y) ;
30
Example: Sort 3 integers
• Three-step algorithm:
1. Read in three integers x, y and z
2. Put smallest in x
• Swap x, y if necessary; then swap x, z if necessary.
3. Put second smallest in y
• Swap y, z if necessary.
31
Contd.
#include <stdio.h>
main()
{
int x, y, z ;
………..
scanf (“%d %d %d”, &x, &y, &z) ;
if (x > y) swap (&x, &y);
if (x > z) swap (&x, &z);
if (y > z) swap (&y, &z) ;
………..
}
32
Contd.
33
Pointers and Arrays
34
Example
• Consider the declaration:
int x[5] = {1, 2, 3, 4, 5} ;
– Suppose that the base address of x is 2500, and each
integer requires 4 bytes.
Element Value Address
x[0] 1 2500
x[1] 2 2504
x[2] 3 2508
x[3] 4 2512
x[4] 5 2516
35
Contd.
x &x[0] 2500 ;
36
Example: function to find average
int *array
#include <stdio.h> float avg (int array[ ],int size)
main() {
{ int *p, i , sum = 0;
int x[100], k, n ;
p = array ; p[i]
scanf (“%d”, &n) ;
for (i=0; i<size; i++)
for (k=0; k<n; k++) sum = sum + *(p+i);
scanf (“%d”, &x[k]) ;
return ((float) sum / size);
printf (“\nAverage is %f”, }
avg (x, n));
}
37