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
Discussion & Comments