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 x 500 a 300 pointerpointee
Syntax: type * identifier; i.e. int *p; G p 258 pointer
int a=50; int * p; p = &a; p 500 pointer 50 a 300 pointee p points to a 300
* and & operators Dereferencing *p value at where pointer p is pointing Address of &a address 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; } p 500 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; } p 500 pointer 50 a 300 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 p 500 pointer 50 a 300 pointee
Example: void main(){ int *p; int a=50; p = &a; =>cout<<a<<endl;// 50 cout<<&a<<endl; cout<<p<<endl; cout<<*p<<endl; cout<<&p<<endl; } 300 p 500 pointer 50 a 300 pointee
Example: void main(){ int *p; int a=50; p = &a; cout<<a<<endl;// 50 =>cout<<&a<<endl;// 300 cout<<p<<endl; cout<<*p<<endl; cout<<&p<<endl; } 300 p 500 pointer 50 a 300 pointee
Example: void main(){ int *p; int a=50; p = &a; cout<<a<<endl;// 50 cout<<&a<<endl;// 300 =>cout<<p<<endl;// 300 cout<<*p<<endl; cout<<&p<<endl; } 300 p 500 pointer 50 a 300 pointee
Example: void main(){ int *p; int a=50; p = &a; cout<<a<<endl;// 50 cout<<&a<<endl;// 300 cout<<p<<endl;// 300 =>cout<<*p<<endl;// 50 cout<<&p<<endl; } 300 p 500 pointer 50 a 300 pointee
Example: void main(){ int *p; int a=50; p = &a; cout<<a<<endl;// 50 cout<<&a<<endl;// 300 cout<<p<<endl;// 300 cout<<*p<<endl;// 50 =>cout<<&p<<endl;// 500 } 300 p 500 pointer 50 a 300 pointee
Example 2: void main(){ int *p; int a=50; cout<<*p<<endl; } What would be the output? Runtime error!!! p 500 pointer 50 a 300 pointee Crash!!!
Dangling Pointer int *p; Note: Dereferencing a dangling pointer is a serious runtime error. G p 500 pointer Dangling pointer
Problem: We can’t differentiate that whether a pointer is dangling or has a valid address. What’s the solution?
NULL Pointer int *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. p 500 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; p 500 pointer 50 a 300 pointee p points to a 300 p2 200 pointer 300 Note: Pointer assignment only copies the address and not the memory they are pointing to.
Shallow Copy 300 p 500 pointer 50 a 300 pointee p points to a 300 p2 200 pointer
Problem with Shallow Copy 300 p 500 pointer 50 a 300 pointee p points to a 300 p2 200 pointer What if p delete a?
What is the solution to the problem?
Deep Copy 300 p 500 pointer 50 a 300 pointee p points to a 100 p2 200 pointer 50 a2 100 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 & Arrays int arr[ ]={5,6,7,8,4,3,5}; // size of arr? int *p = arr; // why & isn’t use before arr? cout<<arr<<endl;// 40 cout<<p<<endl;// 40 p=p+3; p 500 pointer
2. Pointer & Arrays int arr[ ]={5,6,7,8,4,3,5}; // size of arr? int *p = arr; // why & isn’t use before arr? cout<<arr<<endl;// 40 cout<<p<<endl;// 40 p=p+3; cout<<p<<endl;// 46 cout<<*p<<endl;// p 500 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; }
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; } p 500 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; } p 500 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; } p 500 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; } p 500 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; } p 500 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; } p 500 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; } p 500 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; } p 500 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; } p 500 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 } p 500 pointer
Arrays of Pointer data_type *arr[size]; i.e. int *a[7]; char *c[7]; ******* *******
Uses: Sharing & Cost saving Pass-by-ref Dynamic Memory Allocation Making Complex Data Structures Linked list, Tree etc.
1. Sharing & cost saving void main(){ int a=5,b=8; swap(&a,&b); } void swap(int *a,int *b){ int t = *a; *a = *b; *b = t; }
2. DMA void 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 Data Pointer Data Pointer Data Pointer Data Pointer
References: Pointer And Memory ( Pointer Basics ( c/lesson6.html c/lesson6.html tml