Bird
Raised Fist0
Cprogramming~10 mins

Pointers to pointers in C - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Pointers to pointers
Declare int variable
↓
Declare pointer to int
↓
Declare pointer to pointer to int
↓
Assign int address to pointer
↓
Assign pointer address to pointer to pointer
↓
Access value via pointer
↓
Access value via pointer to pointer
This flow shows how a variable's address is stored in a pointer, and that pointer's address is stored in a pointer to pointer, allowing access to the original value through two levels of indirection.
Execution Sample
C
int x = 10;
int *p = &x;
int **pp = &p;
printf("%d\n", **pp);
This code declares an int, a pointer to it, and a pointer to that pointer, then prints the int value via the pointer to pointer.
Execution Table
StepVariableValueActionOutput
1x10Declare int x with value 10
2paddress of xAssign p = &x
3ppaddress of pAssign pp = &p
4**pp10Dereference pp twice to get x's value10
5Program ends
💡 Program ends after printing the value 10 accessed via pointer to pointer
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
xundefined10101010
pundefinedundefinedaddress of xaddress of xaddress of x
ppundefinedundefinedundefinedaddress of paddress of p
Key Moments - 2 Insights
Why do we need a pointer to a pointer instead of just a pointer?
A pointer to a pointer stores the address of a pointer variable, allowing us to indirectly access or modify the original pointer. See step 3 and 4 in the execution_table where pp holds p's address, and **pp accesses x's value.
What does **pp mean in the code?
**pp means dereferencing twice: first to get the pointer p stored at pp, then to get the value x pointed to by p. This is shown in step 4 of the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of p after step 2?
A10
Baddress of x
Caddress of p
Dundefined
💡 Hint
Check the 'Value' column for variable p at step 2 in the execution_table
At which step does **pp give the value 10?
AStep 4
BStep 3
CStep 2
DStep 5
💡 Hint
Look at the 'Variable' and 'Output' columns in the execution_table for **pp
If we change x to 20 after step 1, what will **pp output at step 4?
A10
Baddress of x
C20
Daddress of p
💡 Hint
Refer to variable_tracker to see how x's value affects **pp output
Concept Snapshot
Pointers to pointers in C:
- int *p stores address of int variable
- int **pp stores address of pointer p
- Access value via **pp (double dereference)
- Useful for indirect pointer manipulation
- Syntax: int **pp = &p;
Full Transcript
This example shows how pointers to pointers work in C. First, an integer variable x is declared with value 10. Then, a pointer p stores the address of x. Next, a pointer to pointer pp stores the address of p. When we use **pp, we dereference twice: first to get p, then to get x's value. The program prints 10 by accessing x through pp. This helps understand how multiple levels of pointers allow indirect access to variables.

Practice

(1/5)
1. What does a pointer to a pointer store in C?
easy
A. The size of a variable
B. The value of an integer
C. The address of another pointer
D. The address of a function

Solution

  1. Step 1: Understand pointer basics

    A pointer stores the address of a variable.
  2. Step 2: Understand pointer to pointer

    A pointer to pointer stores the address of another pointer, not a direct value.
  3. Final Answer:

    The address of another pointer -> Option C
  4. Quick Check:

    Pointer to pointer = address of pointer [OK]
Hint: Pointer to pointer holds address of pointer, not value [OK]
Common Mistakes:
  • Confusing pointer to pointer with pointer to value
  • Thinking it stores the value directly
  • Mixing it with function pointers
2. Which of the following is the correct way to declare a pointer to a pointer to an int in C?
easy
A. int **ptr;
B. int ptr*;
C. int *ptr*;
D. int &ptr*;

Solution

  1. Step 1: Recall pointer declaration syntax

    Single pointer to int is declared as int *ptr;.
  2. Step 2: Extend to pointer to pointer

    Pointer to pointer uses two asterisks: int **ptr;.
  3. Final Answer:

    int **ptr; -> Option A
  4. Quick Check:

    Pointer to pointer declaration uses two * [OK]
Hint: Use two * for pointer to pointer declaration [OK]
Common Mistakes:
  • Placing * incorrectly in declaration
  • Using & instead of *
  • Confusing pointer syntax with references
3. What is the output of the following C code?
int x = 10;
int *p = &x;
int **pp = &p;
printf("%d", **pp);
medium
A. Address of x
B. Compilation error
C. Address of p
D. 10

Solution

  1. Step 1: Understand variable assignments

    x = 10, p points to x, pp points to p.
  2. Step 2: Evaluate **pp

    *pp gives p (pointer to x), **pp gives value at x, which is 10.
  3. Final Answer:

    10 -> Option D
  4. Quick Check:

    **pp dereferences twice to get x's value [OK]
Hint: Double dereference **pp gets original value [OK]
Common Mistakes:
  • Printing pointer address instead of value
  • Using single * instead of **
  • Confusing *p and **pp
4. Identify the error in the following code snippet:
int x = 5;
int *p = &x;
int **pp;
*pp = p;
printf("%d", **pp);
medium
A. Syntax error in printf
B. pp is not initialized before dereferencing
C. x is not initialized
D. p is not assigned correctly

Solution

  1. Step 1: Check pointer initialization

    pp is declared but not initialized to point anywhere.
  2. Step 2: Analyze dereferencing *pp = p;

    Dereferencing uninitialized pp causes undefined behavior or crash.
  3. Final Answer:

    pp is not initialized before dereferencing -> Option B
  4. Quick Check:

    Dereferencing uninitialized pointer causes error [OK]
Hint: Always initialize pointers before dereferencing [OK]
Common Mistakes:
  • Assuming pointer auto-initializes
  • Ignoring uninitialized pointer usage
  • Confusing pointer assignment with value assignment
5. Given the code below, what will be the output?
int a = 3, b = 7;
int *p1 = &a;
int *p2 = &b;
int **pp = &p1;
*pp = p2;
printf("%d %d", *p1, *p2);
hard
A. 7 7
B. 3 7
C. 3 3
D. Compilation error

Solution

  1. Step 1: Initial pointer assignments

    p1 points to a (3), p2 points to b (7), pp points to p1.
  2. Step 2: Change p1 via pointer to pointer

    *pp = p2 changes p1 to point to b (7).
  3. Step 3: Print values

    *p1 now points to b (7), *p2 is 7, so output is "7 7".
  4. Final Answer:

    7 7 -> Option A
  5. Quick Check:

    Pointer to pointer changed p1 to point to b [OK]
Hint: Pointer to pointer can change pointer target [OK]
Common Mistakes:
  • Assuming p1 still points to a
  • Confusing *pp and **pp
  • Ignoring pointer reassignment effect
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard