Prerequisite : Pointers in C/C++, Memory Layout of C Programs.
- To pass arguments by reference. Passing by reference serves two purposes
(i) To modify variable of function in other. Example to swap two variables;
C
// C program to demonstrate that we can change // local values of one function in another using pointers. #include <stdio.h> void swap( int * x, int * y) { int temp = *x; *x = *y; *y = temp; } int main() { int x = 10, y = 20; swap(&x, &y); printf ( "%d %d\n" , x, y); return 0; } |
C++
// C++ program to demonstrate that we can change // local values of one function in another using // pointers. #include <iostream> using namespace std; void swap( int * x, int * y) { int temp = *x; *x = *y; *y = temp; } int main() { int x = 10, y = 20; swap(&x, &y); cout << x << " " << y << endl; return 0; } |
Output :
20 10
(ii) For efficiency purpose. Example passing large structure without reference would create a copy of the structure (hence wastage of space).
Note : The above two can also be achieved through References in C++.
- For accessing array elements. Compiler internally uses pointers to access array elements.
C
// C program to demonstrate that compiler // internally uses pointer arithmetic to access // array elements. #include <stdio.h> int main() { int arr[] = { 100, 200, 300, 400 }; // Compiler converts below to *(arr + 2). printf ( "%d " , arr[2]); // So below also works. printf ( "%d\n" , *(arr + 2)); return 0; } |
C++
// C++ program to demonstrate that compiler // internally uses pointer arithmetic to access // array elements. #include <iostream> using namespace std; int main() { int arr[] = { 100, 200, 300, 400 }; // Compiler converts below to *(arr + 2). cout << arr[2] << " " ; // So below also works. cout << *(arr + 2) << " " ; return 0; } |
Output :
300 300
- To return multiple values. Example returning square and square root of numbers.
C
// C program to demonstrate that using a pointer // we can return multiple values. #include <math.h> #include <stdio.h> void fun( int n, int * square, double * sq_root) { *square = n * n; *sq_root = sqrt (n); } int main() { int n = 100; int sq; double sq_root; fun(n, &sq, &sq_root); printf ( "%d %f\n" , sq, sq_root); return 0; } |
C++
// C++ program to demonstrate that using a pointer // we can return multiple values. #include <bits/stdc++.h> using namespace std; void fun( int n, int * square, double * sq_root) { *square = n * n; *sq_root = sqrt (n); } int main() { int n = 100; int * sq = new int ; double * sq_root = new double ; fun(n, sq, sq_root); cout << *sq << " " << *sq_root; return 0; } |
Output :
10000 10
- Dynamic memory allocation : We can use pointers to dynamically allocate memory. The advantage of dynamically allocated memory is, it is not deleted until we explicitly delete it.
C
// C program to dynamically allocate an // array of given size. #include <stdio.h> #include<stdio.h> int * createArr( int n) { int * arr = ( int *)( malloc (n * sizeof ( int ))); return arr; } int main() { int * pt = createArr(10); return 0; } |
C++
// C++ program to dynamically allocate an // array of given size. #include <iostream> using namespace std; int * createArr( int n) { return new int [n]; } int main() { int * pt = createArr(10); return 0; } |
- To implement data structures.
Example linked list, tree, etc. We cannot use C++ references to implement these data structures because references are fixed to a location (For example, we can not traverse a linked list using references) - To do system level programming where memory addresses are useful. For example shared memory used by multiple threads. For more examples, see IPC through shared memory, Socket Programming in C/C++, etc
Attention reader! Don’t stop learning now. Get hold of all the important C++ Foundation and STL concepts with the C++ Foundation and STL courses at a student-friendly price and become industry ready.