Pointer arithmetic in C++ - Time & Space Complexity
Let's see how the time needed changes when we use pointer arithmetic in C++.
We want to know how the number of steps grows as we move through memory with pointers.
Analyze the time complexity of the following code snippet.
int sumArray(int* arr, int size) {
int sum = 0;
int* ptr = arr;
for (int i = 0; i < size; i++) {
sum += *ptr;
ptr++;
}
return sum;
}
This code adds up all numbers in an array using a pointer that moves through the array.
Look for loops or repeated steps.
- Primary operation: The for-loop that moves the pointer and adds values.
- How many times: Exactly once for each element in the array (size times).
As the array gets bigger, the loop runs more times, adding each number.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 additions and pointer moves |
| 100 | About 100 additions and pointer moves |
| 1000 | About 1000 additions and pointer moves |
Pattern observation: The work grows directly with the number of elements.
Time Complexity: O(n)
This means the time to finish grows in a straight line with the array size.
[X] Wrong: "Pointer arithmetic makes the code run faster and changes the time complexity."
[OK] Correct: Pointer arithmetic just changes how we access data, but the number of steps still depends on the array size.
Understanding how loops and pointers work together helps you explain how your code handles data efficiently.
"What if we used two pointers moving from both ends toward the middle? How would the time complexity change?"
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
