Pointers
Pointers
2 Pointers
1 Department of CSE
Objectives
• To understand the need and application of pointers
• To learn how to declare a pointer and how it is represented in
memory
• To learn the relation between arrays and pointers
• To study the need for call-by-reference
• To distinguish between some special types of pointers
2 Department of CSE
Agenda
• Basics of Pointers
• Declaration and Memory Representation
• Operators associated with pointers
• address of operator
• dereferencing operator
• Arrays and Pointers.
• Compatibility of pointers
• Functions and Pointers
• Special types of pointers
• void pointer
• null pointer
• constant pointers
• dangling pointers
• pointer to pointer
3 Department of CSE
Introduction
4 Department of CSE
Pointer Declaration
• General form of a pointer variable declaration:-
datatype *ptrname;
• Eg:-
• int *p; (p is a pointer that can point only integer variables)
• float *fp; (fp can point only floating-point variables)
5 Department of CSE
Initialization of Pointer Variable
• Uninitialized pointers will have some unknown memory address in them.
6 Department of CSE
Why Pointers?
• Manages memory more efficiently.
• Leads to more compact and efficient code than that can be obtained
in other ways
7 Department of CSE
Referencing/ “Address of ” operator
• To make a pointer point to another variable, it is necessary to obtain
the memory address of that variable.
8 Department of CSE
Dereferencing/Indirection Operator
• It‟s a unary operator - *
• This is akin to looking inside a safety deposit box only to find the
number of (and, presumably, the key to ) another box, which you
then open.
9 Department of CSE
Referencing & Dereferencing Operators
10 Department of CSE
Sample Code -1 : Simple Pointer
#include<stdio.h> Output:-
int main()
{ Number : 10
int x=10;
int *ip;
Address: 0x7fff4fab3044
ip=&x; Number using pointer : 10
printf("Number : %d\n",x);
printf("Address: %p\n",(&x)); Address using Pointer: 0x7fff4fab3044
printf("Number using pointer : %d\n", *ip);
printf("Address using Pointer: %p\n",ip);
return 0;
}
11 Department of CSE
Sample Code -2 : Pointers to different types
#include<stdio.h> Output:-
int main()
{ Number using pointer : 10
int x=10;
int *ip;
Address using Pointer: 0x7fff4f5c31bc
float y=2.5, *fp; Decimal value : 2.500000
fp = &y;
ip=&x; Address of y : 0x7fff4f5c31b8
printf("Number using pointer : %d\n", *ip);
printf("Address using Pointer: %p\n",ip);
printf("Decimal value : %f\n",*fp);
printf("Address of y : %p\n",fp);
return 0;
}
12 Department of CSE
Sample Code -3 : Same pointer to multiple variables
#include<stdio.h> Output:-
int main()
{ Enter three integers : 10 20 30
int a,b,c,*p; //a,b and c are variables and p is a
pointer pointer points to a. Value is 10
printf("Enter three integers : "); pointer points to b. Value is 20
scanf("%d %d %d",&a,&b,&c);
p = &a; pointer points to c. Value is 30
printf("pointer points to a. Value is %d\n",*p);
p = &b;
printf("pointer points to b. Value is %d\n",*p);
p = &c;
printf("pointer points to c. Value is %d\n",*p);
return 0;
}
13 Department of CSE
Sample Code -4 : Multiple Pointers to same variable
#include<stdio.h> Output:-
int main()
{ Enter an integer : 15
int a;
int *p = &a; 15
int *q = &a; 15
int *r = &a;
15
printf("Enter an integer : ");
scanf("%d",&a);
printf("%d\n",*p);
printf("%d\n",*q);
printf("%d\n",*r);
return 0;
}
14 Department of CSE
Pointer and 1D Array
15 Department of CSE
Relationship between array and pointer
• The name of array is a pointer to the first element
• Address of first element and name of array represent the same memory address.
16 Department of CSE
Sample Program 5 : Pointer and Array I
Output:-
#include<stdio.h>
int main() 0x7fff03b2d380 0x7fff03b2d380
{ 11
int a[5] = {1,2,3,4,5};
int *p = a;
printf("%p %p\n",&a[0],a);
printf("%d %d\n",*a,*p);
return 0;
}
17 Department of CSE
Sample Program 6 : Pointer and Array II
#include<stdio.h>
Output:-
int main()
First element : 1 1
{
int a[5] = {1,2,3,4,5}; Second element: 2 2
int *p = &a[1];
return 0;
}
Note:-When a pointer to an array is not pointing to the first
element, index can be negative.
18 Department of CSE
Pointer Arithmetic and 1D Arrays
• If „a‟ is an array name, then „a‟ points to first element
• a+1 points to the second element, a+2 points to third element and
so on.
• Generally (a+n) points to (n+1)th element.
19 Department of CSE
Pointer arithmetic on different data types
• Size of single element varies with respect
to data type of array.
20 Department of CSE
Modifying values using pointers
21 Department of CSE
Modifying value using pointer
• If ip points to an integer x, *ip can be used in places where x could
have been used.
22 Department of CSE
Sample Code –7: Updating value using Pointer
#include<stdio.h>
int main() Output:-
{
Number using pointer : 10
int x=10;
int *ip; Address using Pointer:
float y=2.5, *fp; 0x7fff76d4f8ec
fp = &y;
ip=&x; Decimal value : 2.500000
printf("Number using pointer : %d\n", *ip); Address of y : 0x7fff76d4f8e8
printf("Address using Pointer: %p\n",ip);
printf("Decimal value : %f\n",*fp);
Updated Number : 11
printf("Address of y : %p\n",fp); Updated Number : 55
x+=1;
printf("Updated Number : %d\n", *ip);
Updated Number : 56
*ip *=5;
printf("Updated Number : %d\n", *ip);
++*ip;
printf("Updated Number : %d\n", *ip);
return 0;
}
23 Department of CSE
Sample Code -8 : Adding two numbers using Pointers
#include<stdio.h>
int main()
Output:-
{ 10 + 5 = 15
int a=10,b=5,c;
int *p1 = &a;
int *p2 = &b;
int *res = &c;
printf("%d + %d = %d\n",*p1,*p2,c);
return 0;
}
24 Department of CSE
Pointer to array : Order of placing „*‟ and „++‟
• Assume that z is an inger array with two values 1 and 2 (int z[2]={1,2};)
• Let ip be a pointer to z; (int *ip = z;)
• printf("%d\n", ++*ip);
• increments content in the address pointed by ip.
• z[0]=1 was taken and incremented by 1.
• In output the value is 2
• printf("%d\n", *++ip);
• increments the address pointed by ip.
• ip currently points to z[1]=3
• In output the value is 3
25 Department of CSE
Sample Code Snippet - 9a – ++ before *
#include<stdio.h> • Sample Output
main()
{ 0x7fff0fc66d30
int z[2]={1,3};
int * ip = z; 1
printf("%p\n",ip);
printf("%d\n", *ip);
2
printf("%d\n", ++*ip); 0x7fff0fc66d30
printf("%p",ip);
return 0;
}
26 Department of CSE
Sample Code Snippet -9b : * before ++
#include<stdio.h> • Sample Output
main()
{ 0x7ffffc801740
int z[2]={1,3};
int * ip = z; 1
printf("%p\n",ip);
printf("%d\n", *ip);
3
printf("%d\n", *++ip); 0x7ffffc801744
printf("%p",ip);
return 0;
}
27 Department of CSE
Pointer Compatibility
28 Department of CSE
Pointer Compatibility
• Pointers have a type associated with them They can point only
to specific type.
• Two types:-
• Pointer Size Compatibility
• Pointer Dereferencing compatibility
29 Department of CSE
Pointer Size Compatibility
• Size of all pointers is the same; i.e.; every pointer variable holds the
address of one memory location. But the size of variable that the
pointer points to can be different.
• Size of the type that a pointer points to is same as its data size.
30 Department of CSE
Sample Code -10 : Pointer Size Compatibility
#include<stdio.h> printf("Size of c : %3d | ",sizeofc);
int main() printf("Size of pc : %3d | ",sizeofpc);
{ printf("size of *pc : %3d\n",sizeofstarpc);
char c; printf("Size of a : %3d | ",sizeofa);
char* pc; printf("Size of pa : %3d | ",sizeofpa);
int sizeofc = sizeof(c); printf("size of *pa : %3d\n",sizeofstarpa);
int sizeofpc = sizeof(pc); printf("Size of d : %3d | ",sizeofd);
int sizeofstarpc = sizeof(*pc); printf("Size of pd : %3d | ",sizeofpd);
printf("size of *pd : %3d\n",sizeofstarpd);
int a; return 0;
int* pa; }
int sizeofa = sizeof(a);
int sizeofpa = sizeof(pa); Sample Output
int sizeofstarpa = sizeof(*pa);
Size of c : 1 | Size of pc : 8 | size of *pc : 1
double d;
Size of a : 4 | Size of pa : 8 | size of *pa : 4
double* pd;
int sizeofd = sizeof(d); Size of d : 8 | Size of pd : 8 | size of *pd : 8
int sizeofpd = sizeof(pd);
int sizeofstarpd = sizeof(*pd);
31 Department of CSE
Dereferencing Compatibility
• Dereference type is the type of variable that the pointer is
referencing.
32 Department of CSE
Sample Code 11: Pointer Dereferencing Incompatibility
#include<stdio.h>
ptrcompat.c: In function ‘main’:
int main()
{ ptrcompat.c:13: warning: assignment from
int x=10; incompatible pointer type
int *ip;
float y=2.5, *fp;
fp = &y; Output:-
ip=&x;
printf("Number using pointer : %d\n", *ip); Number using pointer : 10
printf("Address using Pointer: %p\n",ip);
printf("Decimal value : %f\n",*fp);
Address using Pointer: 0x7fffda19b6ec
printf("Address of y : %p\n",fp); Decimal value : 2.500000
fp = &x;
printf("New value pointed by fp = %f\n",*fp); Address of y : 0x7fffda19b6e8
return 0; New value pointed by fp = 0.000000
}
33 Department of CSE
Pointers and Functions
34 Department of CSE
How to swap two numbers using function?
#include<stdio.h>
int main() Output:-
{ Enter first number : 5
int a,b;
Enter second number: 10
void swap(int ,int );
Numbers before function call: 5 10
printf("Enter first number : " );
scanf("%d",&a); Numbers before swapping : 5 10
printf("Enter second number: "); Numbers after swapping : 10 5
scanf("%d",&b); Numbers after function call : 5 10
printf("Numbers before function call: %d\t%d\n",a,b);
swap(a,b);
printf("Numbers after function call : %d\t%d\n",a,b);
return 0;
} void swap(int a, int b)
{
int t;
printf("Numbers before swapping : %d\t%d\n",a,b);
t = a;
a = b;
b = t;
printf("Numbers after swapping : %d\t%d\n",a,b);
35 Department of CSE }
How to swap two numbers using function?
• Values are getting interchanged inside the function. But that is not
getting reflected in main.
36 Department of CSE
How to swap two numbers using function?
#include<stdio.h>
int main() Output:-
{ Enter first number : 5
int a,b;
Enter second number: 10
void swap(int *,int *);
Numbers before function call: 5 10
printf("Enter first number : " );
scanf("%d",&a); Numbers before swapping : 5 10
printf("Enter second number: "); Numbers after swapping : 10 5
scanf("%d",&b); Numbers after function call : 10 5
printf("Numbers before function call: %d\t%d\n",a,b);
swap(&a,&b);
printf("Numbers after function call : %d\t%d\n",a,b);
return 0;
} void swap(int *a, int *b)
{
int t;
printf("Numbers before swapping : %d\t%d\n",*a,*b);
t = *a;
*a = *b;
*b = t;
printf("Numbers after swapping : %d\t%d\n",*a,*b);
37 Department of CSE }
Points to be noted while using Call-by-Reference
Call-by-Value Call-by-Reference
Function Declaration void swap(int ,int ); void swap(int *,int *);
Function Header void swap(int a, int b) void swap(int *a, int *b)
Function Call swap(a,b); swap(&a,&b);
38 Department of CSE
When do you need pointers in functions?
• First scenario – In Call-by-Reference.
• There is a requirement to modify the values of actual arguments.
39 Department of CSE
Passing array as an argument to a function
• When an array is passed as an argument to a function, it is actually
passed as reference.
40 Department of CSE
Sample Code 12 : Passing an array to a function
#include<stdio.h>
int main() void square(int *a,int n)
{ {
int a[5]={1,2,3,4,5}; int i;
int i; for(i=0;i<n;i++)
//First argumnt is an array and second argument is its size a[i] *= a[i];
void square(int *,int); }
printf("Array before modification:-\n");
for(i=0;i<5;i++)
printf("%d\t",a[i]);
square(a,5);
printf("\nArray after modification:-\n");
for(i=0;i<5;i++) Output:-
printf("%d\t",a[i]); Array before modification:-
printf("\n");
return 0;
1 2 3 4 5
} Array after modification:-
1 4 9 16 25
41 Department of CSE
Returning Multiple values from a function
• Normally, a function can return only a single value from it, using
„return‟.
• What if, you have to return two or more values from a function?
42 Department of CSE
Sample Code 13 : Returning Multiple Values
#include<stdio.h> void MinMax(int *a, int n, int *min,int *max)
int main() {
{ int i;
int a[5]; *min = *max = a[0];
void MinMax(int *,int,int*,int*); for(i=1;i<n;i++)
int i,min,max; {
for(i=0;i<5;i++) if(a[i] < (*min))
{ *min = a[i];
printf("Number %d : ",(i+1)); }
scanf("%d",&a[i]); for(i=1;i<n;i++)
} {
MinMax(a,5,&min,&max); if(a[i] > (*max))
printf("Minimum element entered : %d\n",min); *max = a[i];
printf("Maximum element entered : %d\n",max); }
return 0; }
}
43 Department of CSE
Sample Code 13 : Returning Multiple Values - Output
Output:-
Number 1 : 2
Number 2 : 1
Number 3 : 3
Number 4 : 5
Number 5 : 4
Minimum element entered : 1
Maximum element entered : 5
44 Department of CSE
Special Pointers
45 Department of CSE
Void Pointer
• A generic type that is not associated with a reference type.
• It is not the address of a particular data type.
• A pointer with no reference type that can store only address of any
variable.
• Compatible for assignment purposes only with all other types of
pointers.
• A pointer of any reference can be assigned to void type and vice
verse.
• Restriction : It can not be dereferenced unless it is cast.
• Declaration:- void* pvoid;
• General Casting:- dest_ptr = (dest_ptr_type *) source_ptr_name;
46 Department of CSE
NULL Pointer
• A pointer of any type that is assigned the constant NULL
• The reference type of pointer will not change by the assignment of
NULL
• Eg:-
int* iptr = NULL; //NULL pointer of type „int‟
Char* cptr = NULL; //NULL pointer of type „char‟
47 Department of CSE
Dangling Pointer
• Arises during object destruction, when an object that has an incoming reference
is deleted or deallocated, without modifying the value of the pointer, so that the
pointer still points to the memory location of the deallocated memory.
• Example of creating Dangling pointer
int main()
{
char *ptr=NULL;
{
char c;
ptr = &c;
}
}
• c falls out of scope after the inner block making ptr a dangling pointer
48 Department of CSE
Constant pointer
• A pointer that cannot change the address its holding.
• Once a constant pointer points to a variable then it cannot point to any other variable.
• Declaration:- <type of pointer> * const <name of pointer>
• Example:- int* const ptr;
• Sample Code : Will give the error 7: error: assignment of read-only variable „ptr‟
#include<stdio.h>
int main(void)
{
int var1 = 0, var2 = 0;
int *const ptr = &var1;
ptr = &var2;
printf("%d\n", *ptr);
return 0;
}
49 Department of CSE
Pointer to a Pointer
• A pointer points to an address of another pointer.
• Also called Double Pointer.
• Declaration:- type **ptr_name;
• Example:- int **p;
• Sample:-
int main()
{
int p=5;
int *p1 = &p;
int **pp;
pp = &p1;
printf(“Value of P : %d\n”,**pp);
return 0;
}
Output : Value of P : 5
50 Department of CSE
Summary
• Discussed about Pointer and its importance.
• Discussed relationship between array and pointer
• Discussed about Call-by-Reference and other places where pointers
are needed for functions.
• Discussed special pointers.
51 Department of CSE
References
• Books/Materials
1. C Programming Course – Compiled HTML Help File
2. Brian W Kernighan, Dennis M Ritchie, “The C Programming
Language”, 2nd Edition, PHI
• Web
1. http://www.tutorialspoint.com/cprogramming/c_pointers.htm
2. http://www.cprogramming.com/tutorial/c/lesson6.html
52 Department of CSE