我有一个例子:
int i = 1;
const int *b = &i;
在这种情况下,我不明白的是,
当i
的地址转换为指向const int的指针时。 i
是否在资格转换中转换为常量?当应用资格转换时,究竟在幕后发生了什么?
答案 0 :(得分:6)
引擎盖下没有任何事情发生。 const
是严格编译时实体。编译器仅使用const
的知识来确定语句是否是错误而不是用于生成代码。因此如下:
int i = 1;
const int *b = &i;
相当于
int i = 1;
int *b = &i;
根据生成的代码。但是,如果您执行以下操作:
int i = 1;
const int *b = &i;
*b = 1;
编译器会注意到b
有const
(虽然它不知道i
)并且会出错。但是,任何不被视为添加了const的错误的语句都会生成相同的代码,包括或不包含const。
答案 1 :(得分:1)
i的地址被转换为指向const int的指针
否即可。 &i
仍然是int
(不是const int
)的地址。引擎盖int*
隐式转换为const int*
。因此*b
不可修改,但i
仍然可以修改。
另外,请以不同的方式思考:如果您的假设是真的,那么以下将给出编译器错误,但它不会:
int i = 1;
const int *b = &i;
int *c = &i; // perfectly valid !