我正在寻找一个关于如何使用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...
答案 0 :(得分:2)
当涉及指针转换中的const正确性规则时,对于非数组数据类型T *
,C语言支持从类型const T *
到类型T
的隐式转换。这是唯一的" const-protect" C语言支持的隐式转换。
换句话说,如果T *
和const U *
相同的非数组类型,则支持从T
到U
的转换。如果T
与U
有所不同,则隐式转换无效(即使T
和U
之间的差异只是一些额外的const限定符)。
简单来说,只允许在最内层const
之后添加*
。您不能在任何更深层次的间接添加const
。这就是您使用p5
和cube
的行无法编译的原因。
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
。