Pointers. Overview What are Pointers? How to use Pointers? Use of Pointers

Preview:

Citation preview

Pointers

Overview What are Pointers?

How to use Pointers?

Use of Pointers

Pointer: A variable that can only store the

address of a memory location (usually the address of other variable).

300

x500

a300

pointer pointee

Syntax: type * identifier;

i.e. int *p;

G

p258

pointer

int a=50;

int * p;

p = &a;

p500

pointer

50

a300

pointee

p points to a

300

* and & operators Dereferencing

*pvalue at where pointer p is

pointing

Address of&aaddress of variable a

Example:

void main(){int *p;int a=50;p = &a;cout<<a<<endl;cout<<&a<<endl;cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

Example:

void main(){=> int *p;

int a=50;p = &a;cout<<a<<endl;cout<<&a<<endl;cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

p500

pointer

Example:

void main(){int *p;

=> int a=50;p = &a;cout<<a<<endl;cout<<&a<<endl;cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

p500

pointer

50

a300

pointee

Example:

void main(){int *p;int a=50;

=> p = &a;cout<<a<<endl;cout<<&a<<endl;cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

300

p500

pointer

50

a300

pointee

Example:

void main(){int *p;int a=50;p = &a;

=> cout<<a<<endl; // 50cout<<&a<<endl;cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

300

p500

pointer

50

a300

pointee

Example:

void main(){int *p;int a=50;p = &a;cout<<a<<endl; // 50

=> cout<<&a<<endl; // 300cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

300

p500

pointer

50

a300

pointee

Example:

void main(){int *p;int a=50;p = &a;cout<<a<<endl; // 50cout<<&a<<endl; // 300

=> cout<<p<<endl; // 300cout<<*p<<endl;cout<<&p<<endl;

}

300

p500

pointer

50

a300

pointee

Example:

void main(){int *p;int a=50;p = &a;cout<<a<<endl; // 50cout<<&a<<endl; // 300cout<<p<<endl; // 300

=> cout<<*p<<endl; // 50cout<<&p<<endl;

}

300

p500

pointer

50

a300

pointee

Example:

void main(){int *p;int a=50;p = &a;cout<<a<<endl; // 50cout<<&a<<endl; // 300cout<<p<<endl; // 300cout<<*p<<endl; // 50

=> cout<<&p<<endl; // 500}

300

p500

pointer

50

a300

pointee

Example 2:

void main(){int *p;int a=50;cout<<*p<<endl;

}

What would be the output?Runtime error!!!

p500

pointer

50

a300

pointee

Crash!!!

Dangling Pointerint *p;

Note: Dereferencing a dangling pointer is a serious runtime error.

G

p500

pointerDangling pointer

Problem:We can’t differentiate that whether a pointer is dangling or has a valid address.

What’s the solution?

NULL Pointerint *p;p = NULL; // points to

// nothing

Tip: Always initialize a pointer with NULL if you don’t have a valid address. This can save a lot of your time on debugging.

p500

pointer

Example:

void main(){int *p = NULL;int a=50;p = &a;cout<<a<<endl;cout<<&a<<endl;cout<<p<<endl;cout<<*p<<endl;cout<<&p<<endl;

}

Pointer Assignment An assignment operation b/w two

pointers makes them points to the same pointee.

int a=50;

int * p;

p = &a;

int p2 = p;

p500

pointer

50

a300

pointee

p points to a

300

p2200

pointer Sharing

300

Note: Pointer assignment only copies the address and not the memory they are pointing to.

Shallow Copy

300

p500

pointer

50

a300

pointee

p points to a

300

p2200

pointer Sharing

Problem with Shallow Copy

300

p500

pointer

50

a300

pointee

p points to a

300

p2200

pointer Wild Pointer

What if p delete a?

What is the solution to the problem?

Deep Copy

300

p500

pointer

50

a300

pointee

p points to a

100

p2200

pointer

50

a2100

pointee

Pointer type and Arithmetic What is type of pointer?

int * p; A pointer has not type!!!

It’s the type of variable the pointer p will point to.

Why we need to specify the type of variable a pointer points to?

1.int a=10;int *p = &a;*p = 4; // how many bytes of copy?

It would be 1 byte in case a was a char.

2. Pointer & Arraysint arr[ ]={5,6,7,8,4,3,5};// size of arr?int *p = arr;// why & isn’t use before arr?cout<<arr<<endl; // 40cout<<p<<endl; // 40p=p+3;

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

2. Pointer & Arraysint arr[ ]={5,6,7,8,4,3,5};// size of arr?int *p = arr;// why & isn’t use before arr?cout<<arr<<endl; // 40cout<<p<<endl; // 40p=p+3;cout<<p<<endl; // 46cout<<*p<<endl; // 8

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){=> int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; cout<<*arr<<endl; cout<<*(arr+4)<<endl; cout<<p<<endl; cout<<&p<<endl; cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5};=> int *p = arr;

cout<< arr<<endl; cout<<*arr<<endl; cout<<*(arr+4)<<endl; cout<<p<<endl; cout<<&p<<endl; cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

=> cout<< arr<<endl; // 0x40 cout<<*arr<<endl; cout<<*(arr+4)<<endl; cout<<p<<endl; cout<<&p<<endl; cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40=> cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; cout<<p<<endl; cout<<&p<<endl; cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5=> cout<<*(arr+4)<<endl; // 4 cout<<p<<endl; cout<<&p<<endl; cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; // 4=> cout<<p<<endl; //0x40 cout<<&p<<endl; cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; // 4 cout<<p<<endl; //0x40=> cout<<&p<<endl; //0x500 cout<<*p<<endl; cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; // 4 cout<<p<<endl; //0x40 cout<<&p<<endl; //0x500=> cout<<*p<<endl; // 5 cout<<p[3]<<endl; cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; // 4 cout<<p<<endl; //0x40 cout<<&p<<endl; //0x500 cout<<*p<<endl; // 5=> cout<<p[3]<<endl; // 8 cout<<p++<<endl; cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; // 4 cout<<p<<endl; //0x40 cout<<&p<<endl; //0x500 cout<<*p<<endl; // 5 cout<<p[3]<<endl; // 8=> cout<<p++<<endl; // 0x40 cout<<++*p<<endl;}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Example 3:

void main( ){ int arr[ ]={5,6,7,8,4,3,5}; int *p = arr;

cout<< arr<<endl; // 0x40 cout<<*arr<<endl; // 5 cout<<*(arr+4)<<endl; // 4 cout<<p<<endl; //0x40 cout<<&p<<endl; //0x500 cout<<*p<<endl; // 5 cout<<p[3]<<endl; // 8 cout<<p++<<endl; // 0x40=> cout<<++*p<<endl; // 7}

5 6 7 8 4 3 5

40 42 44 46 48 50 52

40

p500

pointer

Arrays of Pointerdata_type *arr[size];

i.e.int *a[7];

char *c[7];

* * * * * * *

40 42 44 46 48 50 52

* * * * * * *

80 82 84 86 88 90 92

Uses: Sharing & Cost saving

Pass-by-ref

Dynamic Memory Allocation

Making Complex Data Structures Linked list, Tree etc.

1. Sharing & cost savingvoid main(){

int a=5,b=8;swap(&a,&b);

}void swap(int *a,int *b){

int t = *a;*a = *b;*b = t;

}

2. DMAvoid main(){

int size=0;int *p=NULL;cout<<“Enter No. of Students”<<endl;cin>>size;p = (int *)malloc(size*sizeof(int));for(int i=0;i<size;i++){

cout<<“Enter St “<<i<<“ Marks”<<endl;cin>>p[i]; //= cin>>*p; p++;

}}

3. Data Structures

DataPointer

DataPointer

DataPointer

DataPointer

References: Pointer And Memory (

http://cslibrary.stanford.edu/102/) Pointer Basics (

http://cslibrary.stanford.edu/106/) http://

www.cprogramming.com/tutorial/c/lesson6.html

http://www.cs.cf.ac.uk/Dave/C/node10.html

Recommended