In C, what is the output of the following pointer-to-pointer calculation? Pay attention to operator precedence and tokenization. #include <stdio.h> int power(int ); int main() { int a = 5, aa; / Suppose &a is 1000 (illustrative only) / aa = &a; a = power(&aa); printf("%d ", a); return 0; } int power(int **ptr) { int b; b = ptrptr; / parsed as (**ptr) * (**ptr) / return b; }

Difficulty: Medium

Correct Answer: 25

Explanation:


Introduction / Context:
This problem probes your understanding of how C tokenizes and parses expressions containing both the dereference operator () and the multiplication operator () with pointer-to-pointer types. The sequence ptr*ptr looks confusing but is valid and important to decode correctly.


Given Data / Assumptions:

  • ptr is of type int **.
  • *ptr has type int and points to a.
  • **ptr is the integer value a, initially 5.


Concept / Approach:
In C, lexing splits ptrptr as (*ptr) * ( *ptr), which equals (**ptr) * (**ptr). There is no ***ptr here because the types would not match; instead, you have a multiplication between two dereferenced values, each yielding the same integer.


Step-by-Step Solution:
Compute *ptr → 5.Compute *ptr → dereference the int * to get 5 again.Multiply: 5 * 5 = 25.Return 25; assign back to a; print 25.


Verification / Alternative check:
Add parentheses explicitly as b = (**ptr) * (**ptr); which compiles and clearly yields 25, confirming the analysis.


Why Other Options Are Wrong:
5 would correspond to a single dereference, not a product. 125 or a garbage value would require different operations or undefined behavior; the given code is well-defined with valid pointers.


Common Pitfalls:
Reading the token stream as ***ptr (which would be a type error here) or thinking multiplication applies to a pointer value directly. Both operands are ints after dereferencing.


Final Answer:
25

More Questions from Pointers

Discussion & Comments

No comments yet. Be the first to comment!
Join Discussion