Pointers in C
1
Pre-requisite
Basics of the C programming language
Data type
Variable
Array
Function call
Standard Input/Output
e.g. printf(), scanf()
2
Outline
Computer Memory Structure
Addressing Concept
Introduction to Pointer
Pointer Manipulation
Summary
3
Computer Memory Revisited
Computers store data in memory slots
Each slot has an unique address
Variables store their values like this:
Addr Content Addr Content Addr Content Addr Content
1000 i: 37 1001 j: 46 1002 k: 58 1003 m: 74
1004 a[0]: ‘a’ 1005 a[1]: ‘b’ 1006 a[2]: ‘c’ 1007 a[3]: ‘\0’
1008 ptr: 1001 1009 … 1010 1011
4
Computer Memory Revisited
Altering the value of a variable is indeed
changing the content of the memory
e.g. i = 40; a[2] = ‘z’;
Addr Content Addr Content Addr Content Addr Content
1000 i: 40 1001 j: 46 1002 k: 58 1003 m: 74
1004 a[0]: ‘a’ 1005 a[1]: ‘b’ 1006 a[2]: ‘z’ 1007 a[3]: ‘\0’
1008 ptr: 1001 1009 … 1010 1011
5
Addressing Concept
Pointer stores the address of another
entity
It refers to a memory location
int i = 5;
int *ptr; /* declare a pointer variable */
ptr = &i; /* store address-of i to ptr */
printf(“*ptr = %d\n”, *ptr); /* refer to referee of ptr */
6
Why do we need Pointer?
Simply because it’s there!
It is used in some circumstances in C
Remember this?
scanf(“%d”, &i);
7
What actually ptr is?
ptr is a variable storing an address
ptr is NOT storing the actual value of i
ptr address of i
int i = 5;
int *ptr;
ptr = &i; i 5
printf(“i = %d\n”, i); Output:
printf(“*ptr = %d\n”, *ptr); i = 5 value of ptr =
printf(“ptr = %p\n”, ptr); *ptr = 5 address of i
in memory
ptr = effff5e0
8
int main(int argc, char *argv[]) {
int i=20; 20
int *Ptr;
Ptr=&i; 20
printf("The Value of i= %d\n",i);
printf("The Value of referee of Ptr = %d\n\n",*Ptr);
62FE4C
printf("The Address of i = %p\n",&i);
printf("The Value of Ptr = %p\n\n",Ptr);
62FE4C
printf("The Address of Ptr = %p",&Ptr); 62FE40
return 0;
}
9
Twin Operators
&: Address-of operator
Get the address of an entity
e.g. ptr = &j;
Addr Content Addr Content Addr Content Addr Content
1000 i: 40 1001 j: 33 1002 k: 58 1003 m: 74
1004 ptr: 1001 1005 1006 1007
10
Twin Operators
*: De-reference operator
Refer to the content of the referee
e.g. *ptr = 99;
Addr Content Addr Content Addr Content Addr Content
1000 i: 40 1001 j: 99 1002 k: 58 1003 m: 74
1004 ptr: 1001 1005 1006 1007
11
Example: Pass by Reference
Modify behaviour in argument passing
void f(int j) void f(int *ptr)
{ {
j = 5; *ptr = 5;
} }
void g() void g()
{ {
int i = 3; int i = 3;
f(i); f(&i);
} i = 3? } i = 5?
12
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 5
**pptr = 9; j int integer variable 10
*pptr = &i;
*ptr = -2;
13
An Illustration
int i = 5, j = 10;
int *ptr; /* declare a pointer-to-integer variable */
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 5
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable
*ptr = -2;
14
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr; /* declare a pointer-to-pointer-to-integer variable */
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 5
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable
*ptr = -2;
pptr int ** integer pointer pointer variable
Double
15
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i; /* store address-of i to ptr */
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 5
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable address of i
*ptr = -2;
pptr int ** integer pointer pointer variable
*ptr int de-reference of ptr 5
16
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr; /* store address-of ptr to pptr */
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 5
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable address of i
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
*pptr int * de-reference of pptr value of ptr
(address of i) 17
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 3
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable address of i
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr 3
18
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 7
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable address of i
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
**pptr int de-reference of de-reference of 7
pptr 19
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 7
**pptr = 9; j int integer variable 10
*pptr = &i; ptr int * integer pointer variable address of j
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr 10
20
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 7
**pptr = 9; j int integer variable 9
*pptr = &i; ptr int * integer pointer variable address of j
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
**pptr int de-reference of de-reference of 9
pptr 21
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable 7
**pptr = 9; j int integer variable 9
*pptr = &i; ptr int * integer pointer variable address of i
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
*pptr int * de-reference of pptr value of ptr
(address of i) 22
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3; Data Table
**pptr = 7; Name Type Description Value
ptr = &j; i int integer variable -2
**pptr = 9; j int integer variable 9
*pptr = &i; ptr int * integer pointer variable address of i
*ptr = -2;
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr -2
23
Description of The Previous Slide
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
24
Pointer Arithmetic
What’s ptr + 1?
Thenext memory location!
What’s ptr - 1?
Theprevious memory location!
What’s ptr * 2 and ptr / 2?
Invalid operations!!!
25
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) ?
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) ?
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) ?
*ptr = 6.0; ptr float * float pointer variable
ptr += 2; *ptr float de-reference of float pointer ?
variable
*ptr = 7.0;
26
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) ?
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) ?
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) ?
*ptr = 6.0; ptr float * float pointer variable address of a[2]
ptr += 2; *ptr float de-reference of float pointer ?
variable
*ptr = 7.0;
27
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) ?
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 3.14
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) ?
*ptr = 6.0; ptr float * float pointer variable address of a[2]
ptr += 2; *ptr float de-reference of float pointer 3.14
variable
*ptr = 7.0;
28
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) ?
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 3.14
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) ?
*ptr = 6.0; ptr float * float pointer variable address of a[3]
ptr += 2; *ptr float de-reference of float pointer ?
variable
*ptr = 7.0;
29
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) ?
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 3.14
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) 9.0
*ptr = 6.0; ptr float * float pointer variable address of a[3]
ptr += 2; *ptr float de-reference of float pointer 9.0
variable
*ptr = 7.0;
30
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) ?
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 3.14
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) 9.0
*ptr = 6.0; ptr float * float pointer variable address of a[0]
ptr += 2; *ptr float de-reference of float pointer ?
variable
*ptr = 7.0;
31
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) 6.0
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 3.14
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) 9.0
*ptr = 6.0; ptr float * float pointer variable address of a[0]
ptr += 2; *ptr float de-reference of float pointer 6.0
variable
*ptr = 7.0;
32
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) 6.0
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 3.14
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) 9.0
*ptr = 6.0; ptr float * float pointer variable address of a[2]
ptr += 2; *ptr float de-reference of float pointer 3.14
variable
*ptr = 7.0;
33
Pointer Arithmetic and Array
float a[4];
Data Table
float *ptr;
Name Type Description Value
ptr = &(a[2]);
a[0] float float array element (variable) 6.0
*ptr = 3.14;
a[1] float float array element (variable) ?
ptr++;
a[2] float float array element (variable) 7.0
*ptr = 9.0;
ptr = ptr - 3;
a[3] float float array element (variable) 9.0
*ptr = 6.0; ptr float * float pointer variable address of a[2]
ptr += 2; *ptr float de-reference of float pointer 7.0
variable
*ptr = 7.0;
34
Pointer Arithmetic and Array
float a[4];
Type of a is float *
float *ptr;
ptr = &(a[2]); a[2] *(a + 2)
*ptr = 3.14; ptr = &(a[2])
ptr++; ptr = &(*(a + 2))
*ptr = 9.0;
ptr = a + 2
ptr = ptr - 3;
*ptr = 6.0; a is a memory address constant
ptr += 2; ptr is a pointer variable
*ptr = 7.0;
35
More Pointer Arithmetic
What if a is a double array?
A double may occupy more memory slots!
Given double *ptr = a;
What’s ptr + 1 then?
Addr Content Addr Content Addr Content Addr Content
1000 a[0]: 37.9 1001 … 1002 … 1003 …
1004 a[1]: 1.23 1005 … 1006 … 1007 …
1008 a[2]: 3.14 1009 … 1010 … 1011 …
36
More Pointer Arithmetic
Arithmetic operators + and – auto-adjust
the address offset
According to the type of the pointer:
1000 + sizeof(double) = 1000 + 4 = 1004
Addr Content Addr Content Addr Content Addr Content
1000 a[0]: 37.9 1001 … 1002 … 1003 …
1004 a[1]: 1.23 1005 … 1006 … 1007 …
1008 a[2]: 3.14 1009 … 1010 … 1011 …
37
Question-1
int num[5]={10,20,30,40,50};
int *p;
p=num;
printf("The Value= %d\n",*p++);
p=num;
printf("The Value= %d\n",*++p);
p=num;
printf("The Value= %d\n",++*p);
p=num;
printf("The Value= %d",(*p)++); 38
Question-2
int a[5]={1,2,3,4,5}; *++Ptr = *(++Ptr)
int *Ptr;
*Ptr++ = *(Ptr++)
Ptr=a;
printf("The Value= %d\n",*++Ptr);
printf("The Value= %d\n",*Ptr);
printf("The Value= %d\n",*(Ptr++));
printf("The Value= %d",*Ptr++);
printf("The Value= %d",*Ptr); 39
Question-3
#define prnt(var) printf("The Value=%d\n",var)
int main(int argc, char *argv[]) {
int num[] = {1,3,2,4,3,5,4,2};
int *a = num;
int *b = a + 4;
prnt(*(a + 0)); The Value=1
prnt(*(a + 1)); The Value=3
prnt(*(b - 2)); The Value=2
prnt(*(b - 1)); The Value=4
return 0;
} 40
Advice and Precaution
Pros
Efficiency
Convenience
Cons
Error-prone
Difficult to debug
41
Summary
A pointer stores the address (memory
location) of another entity
Address-of operator (&) gets the
address of an entity
De-reference operator (*) makes a
reference to the referee of a pointer
Pointer and array
Pointer arithmetic
42