【发布时间】:2020-04-28 03:14:53
【问题描述】:
在这段代码中:
const int* const fun(const int *const ptr)
{
return ptr;
}
int main()
{
int i=9;
int *main_ptr;
main_ptr = fun(&i);
return 0;
}
编译器警告:
警告:赋值从指针目标类型中丢弃“const”限定符 [-Wdiscarded-qualifiers] main_ptr = fun(&i);
在将main_ptr 定义为指向const int 的指针时,警告会消失(这是可以理解的),但编译器不会抱怨在从const 指针降级为仅指针时丢弃const 限定符。
在一种情况下是警告行为而在另一种情况下没有警告,因为在这种情况下,当涉及到指向 const int 的指针时,当函数 fun 结束时,指向的变量不会被破坏,并且由于同样的原因 const 指向 int 部分的指针无关紧要,因为变量是本地的并且当 fun 结束时它会被破坏?
【问题讨论】:
-
"编译器不会抱怨丢弃
const限定符,同时从指向int的const指针降级为指向int的指针。"我不明白你的意思。在编译器不发出警告的情况下会发生这种情况? -
您也谈到了
const int,但您的代码中没有const int类型的内容。 -
@jamesdlin 它的指针指向
const int,当const指针降级为仅指针时,编译器不会发出警告/错误。 -
@AgrudgeAmicus 函数参数是按值传递的,因此
fun没有机会修改main_ptr,因此没有可能的 const 违规警告。这与“被指向的变量没有被破坏”无关,我不确定在这种情况下什至意味着什么。 -
@AgrudgeAmicus 您引用的警告是抱怨您将
const T*(指向const的指针)转换为T*。或者“const指针”是指T* const?这与将const int分配给int没有什么不同。
标签: c pointers parameters constants