Type qualification mismatch: binding a pointer to non-const int to the address of a const int
#include
int main()
{
const int k = 7;
int const q = &k; / constant pointer to non-const int */
printf("%d", *q);
return 0;
}
-
AError: RValue required
-
BError: Lvalue required
-
CError: cannot convert from 'const int *' to 'int *const'
-
DNo error
-
EOnly a warning; prints 7
Answer
Correct Answer: Error: cannot convert from 'const int *' to 'int const'
Explanation
Introduction / Context:This tests qualifier compatibility. The expression &k has type const int, but the code tries to initialize q as an int *const, i.e., a constant pointer to non-const int. That discards const on the pointed-to type.
Given Data / Assumptions:
- k is const int.
- &k is of type const int *.
- q is declared as int *const (pointer itself const, target non-const).
Concept / Approach:Type int *const means “a const pointer to int.” The target type is int (modifiable). Assigning the address of a const int to a pointer to non-const int would allow writes to a const object through q, which is forbidden. The correct type would be const int *const q = &k;.
Step-by-Step Solution:Compute &k → const int *.Attempt to bind to int *const → discarding const on pointee.Compilation error: cannot convert from const int * to int *const.Fix: make q a pointer to const: const int *const q = &k;
Verification / Alternative check:With the corrected declaration, dereferencing *q yields 7, but q cannot be used to modify k.
Why Other Options Are Wrong:Rvalue/Lvalue diagnostics are not the issue. “No error” is incorrect because qualifiers are mismatched.
Common Pitfalls:Confusing "const pointer" with "pointer to const"; overlooking that const applies to the pointee type here.
Final Answer:Error: cannot convert from 'const int *' to 'int *const'