添加const的正确方法是什么?

时间:2017-02-11 17:55:55

标签: c const

我正在寻找一个关于如何使用const添加aditional保护的规则。

例如:

int** p1 = ...;
int** const p2=p1; // Legal
int* const * const p3=p1; // Legal
int* const * const p4=p3; // Legal
const int* const * const p5=p3; // Error

int*** cube1= &p1;
int* const ** cube2=cube1; // Error
and so on...

2 个答案:

答案 0 :(得分:2)

当涉及指针转换中的const正确性规则时,对于非数组数据类型T *,C语言支持从类型const T *到类型T的隐式转换。这是唯一的" const-protect" C语言支持的隐式转换。

换句话说,如果T *const U * 相同的非数组类型,则支持从TU的转换。如果TU有所不同,则隐式转换无效(即使TU之间的差异只是一些额外的const限定符)。

简单来说,只允许在最内层const之后添加*。您不能在任何更深层次的间接添加const。这就是您使用p5cube的行无法编译的原因。

int *p = 0;
const int *cp = p; // OK: `const` is added after the first `*`

int **pp = 0;
const int *const *cpp = pp; // Error: a "deep" `const` added 

有时在您的代码中,您可能需要规避这些限制,并在更深层次的间接中添加一些额外的const。在这种情况下,你别无选择,只能使用明确的演员

int **pp = 0;
const int *const *cpp = (const int *const *) pp;  

P.S。 C ++放宽了一些限制,创建了一个更符合逻辑的const正确性规则系统。唉C从来没有采取任何措施。

答案 1 :(得分:2)

const通常适用于左侧定义的值。

示例:

int const *ptr = &val;

在上面的代码段中,const属于int,而不属于*ptr

如果您将*移到const后面,它会使ptr常量指针

int *const ptr = &val;

现在const属于指针,而不属于int

现在看另一个例子

const int *ptr = &val;

只有在语句最左侧有const时,它才适用于它右侧的任何内容,在上面的代码段中,它是int