Pointer arithmetic - Time & Space Complexity
We want to see how the time to run code with pointer arithmetic changes as the input size grows.
How does moving pointers through an array affect the number of steps the program takes?
Analyze the time complexity of the following code snippet.
void printArray(int *arr, int n) {
int *ptr = arr;
for (int i = 0; i < n; i++) {
printf("%d\n", *ptr);
ptr++;
}
}
This code prints each element of an integer array using pointer arithmetic to move through the array.
- Primary operation: Loop that moves the pointer and prints each element.
- How many times: Exactly once for each element in the array, so n times.
Each element causes one print and one pointer move, so the steps grow directly with the number of elements.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The work grows evenly as the input size grows; doubling the input doubles the work.
Time Complexity: O(n)
This means the time to run the code grows in a straight line with the number of elements.
[X] Wrong: "Pointer arithmetic makes the code run faster, so time complexity is less than O(n)."
[OK] Correct: Pointer arithmetic is just a way to access elements; it does not reduce the number of steps needed to process each element.
Understanding how pointer arithmetic affects time helps you explain how low-level code works efficiently, a useful skill in many programming tasks.
"What if we replaced the for loop with a while loop that stops when the pointer reaches the end? How would the time complexity change?"
Practice
int *p;Solution
Step 1: Understand pointer arithmetic basics
In C, 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 the given pointer
Sincepis anint*,p + 1points to the nextintin memory.Final Answer:
Moves the pointer to the next element of the type it points to -> Option DQuick Check:
Pointer + 1 moves by element size [OK]
- Thinking pointer arithmetic moves by 1 byte
- Confusing pointer increment with value increment
- Assuming pointer addition causes errors
int arr[5]; int *p = arr;
Solution
Step 1: Review pointer arithmetic syntax
Valid pointer arithmetic usesp + norp - nwhere n is an integer.Step 2: Check each option
p + 2 is valid syntax. Options A, C, and D contain invalid operators or spacing causing syntax errors.Final Answer:
p + 2 -> Option AQuick Check:
Correct pointer addition syntax isp + n[OK]
- Using invalid operators like '++' incorrectly
- Adding spaces that change meaning
- Confusing pointer increment with addition
int arr[] = {10, 20, 30, 40};
int *p = arr;
printf("%d", *(p + 2));Solution
Step 1: Understand pointer and array relation
Pointerppoints toarr[0], which is 10.Step 2: Calculate pointer offset
*(p + 2)accesses the element 2 positions afterarr[0], which isarr[2]= 30.Final Answer:
30 -> Option CQuick Check:
Pointer + 2 points to third element = 30 [OK]
- Confusing index starting at 1 instead of 0
- Dereferencing pointer without offset
- Mixing pointer arithmetic with array indexing
int arr[3] = {1, 2, 3};
int *p = arr + 3;
printf("%d", *p);Solution
Step 1: Analyze pointer assignment
p = arr + 3points to one element past the last valid element (index 3 in a 3-element array).Step 2: Understand dereferencing invalid pointer
Dereferencing*phere causes undefined behavior because it accesses memory outside the array.Final Answer:
Pointer points beyond array bounds causing undefined behavior -> Option BQuick Check:
Pointer must not dereference beyond array end [OK]
- Assuming pointer can safely dereference past array end
- Confusing pointer arithmetic with array length
- Ignoring undefined behavior risks
int *p1 and int *p2 pointing inside the same array, what does p2 - p1 represent?Solution
Step 1: Understand pointer subtraction in C
Subtracting two pointers gives the number of elements of the pointer type between them, not bytes.Step 2: Apply to pointers inside the same array
Sincep1andp2point inside the same array,p2 - p1counts how many elements separate them.Final Answer:
The number of elements between the two pointers -> Option AQuick Check:
Pointer subtraction = element count difference [OK]
- Thinking subtraction returns byte difference
- Assuming pointer subtraction is invalid
- Confusing pointer subtraction with pointer addition
Ready to prove it?
Pass the test and this pattern moves unknown
