Pointer arithmetic helps you move through memory locations easily. It lets you access elements in arrays or blocks of memory by adding or subtracting numbers to pointers.
Pointer arithmetic in C++
pointer + n pointer - n pointer++ pointer--
Adding or subtracting an integer moves the pointer by that many elements, not bytes.
Increment (++) and decrement (--) move the pointer to the next or previous element.
int arr[5] = {10, 20, 30, 40, 50}; int *p = arr; p = p + 2; // Points to arr[2], value 30
char str[] = "hello"; char *p = str; p++; // Points to 'e' now
int *p1 = &arr[4]; int *p2 = &arr[1]; int diff = p1 - p2; // diff is 3
This program shows how to move a pointer through an array and access elements by changing the pointer position.
#include <iostream> int main() { int numbers[] = {5, 10, 15, 20, 25}; int *ptr = numbers; // points to numbers[0] std::cout << "First element: " << *ptr << "\n"; ptr = ptr + 3; // move pointer to numbers[3] std::cout << "Fourth element: " << *ptr << "\n"; ptr--; std::cout << "Third element after decrement: " << *ptr << "\n"; int diff = ptr - numbers; // distance from start std::cout << "Pointer is " << diff << " elements from start" << "\n"; return 0; }
Pointer arithmetic depends on the type size. For example, adding 1 to an int* moves by sizeof(int) bytes.
Be careful not to move pointers outside the array bounds; it causes undefined behavior.
Pointer subtraction only works if both pointers point to elements of the same array.
Pointer arithmetic lets you move through arrays by adding or subtracting numbers to pointers.
Increment and decrement operators move pointers to next or previous elements.
Subtracting pointers gives the number of elements between them.
Practice
int array?Solution
Step 1: Understand pointer arithmetic basics
Adding 1 to a pointer moves it to the next element of the type it points to, not just 1 byte.Step 2: Apply to
Sinceintpointerintusually occupies 4 bytes, adding 1 moves the pointer by 4 bytes to the next integer.Final Answer:
Moves the pointer to the next integer element in the array -> Option AQuick Check:
Pointer + 1 = next element [OK]
- Thinking pointer arithmetic adds 1 byte always
- Confusing pointer increment with byte increment
- Assuming pointer arithmetic causes errors
Solution
Step 1: Check pointer addition syntax
Adding an integer to a pointer likeptr + 1is valid and moves the pointer forward.Step 2: Check commutativity and subtraction
Integer + pointer like1 + ptris also valid due to commutativity. Pointer - integer likeptr - 1moves pointer backward and is valid.Final Answer:
All of the above -> Option BQuick Check:
Pointer + int and int + pointer both valid [OK]
- Assuming int + pointer is invalid
- Thinking pointer - int is not allowed
- Confusing pointer arithmetic with pointer subtraction
int arr[] = {10, 20, 30, 40};
int *p = arr;
int *q = arr + 3;
std::cout << q - p << std::endl;Solution
Step 1: Understand pointer subtraction
Subtracting two pointers gives the number of elements between them, not bytes.Step 2: Calculate difference between pointers
q = arr + 3points to the 4th element,p = arrpoints to the 1st. Difference is 3 elements.Final Answer:
3 -> Option AQuick Check:
Pointer difference = number of elements [OK]
- Thinking pointer subtraction returns byte difference
- Confusing pointer difference with array values
- Expecting compilation error
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr + 5;
std::cout << *p << std::endl;Solution
Step 1: Analyze pointer initialization
p = arr + 5points one past the last element (index 5), which is outside the array bounds.Step 2: Check dereferencing pointer
Dereferencing*phere is undefined behavior because pointer is out of valid range.Final Answer:
Pointer points outside array bounds, causing undefined behavior -> Option CQuick Check:
Dereferencing out-of-bounds pointer is unsafe [OK]
- Assuming pointer at arr+5 is valid to dereference
- Confusing pointer arithmetic with array indexing
- Ignoring undefined behavior risks
int arr[] = {5, 10, 15, 20, 25};
int *p = arr + 1;
int *q = arr + 4;
int diff = q - p;
std::cout << *(p + diff) << std::endl;Solution
Step 1: Calculate pointer difference
q - p= (arr + 4) - (arr + 1) = 3 elements difference.Step 2: Evaluate pointer arithmetic and dereference
p + diff= (arr + 1) + 3 = arr + 4, which points to the element 25. Dereferencing gives 25.Final Answer:
25 -> Option DQuick Check:
Pointer arithmetic + dereference = correct element [OK]
- Confusing pointer difference with value difference
- Miscalculating pointer arithmetic
- Assuming undefined behavior without reason
Ready to prove it?
Pass the test and this pattern moves unknown
