声明的函数
void f(const char * const p) { ... }
表示它需要一个指向常量字符的常量指针。但是,如果变量p
仅限于函数本身,并且其用法对被调用者隐藏,那么第二个const
是否存在则很重要?
换句话说,从被调用者的角度看,下面的语义是否与第一个语义相同?
void f(const char *p) { ... }
答案 0 :(得分:2)
第二个const
(*
之后的那个)从被调用者的角度来看并不重要。
但从功能体的角度来看它确实很重要。
第二个const
确保您不能使指针改变其值(即指向不同的存储位置)。
它可以将简单的原始参数声明为const
,就像void f(const int value) {}
答案 1 :(得分:2)
第一个const表示您无法更改指向的数据,第二个表示此指针无法覆盖。
所以,对于这个函数的调用者来说,它并不重要。 对于函数的实现,它可能很有用,但它只会在本地生效。
答案 2 :(得分:1)
是。您告诉编译器您不会修改该函数中的p
。这允许编译器进行某些优化,例如,如果p
已经在寄存器中,则无需保存,也无需分配新的寄存器。
如果您尝试修改p
,它还会导致编译器发出诊断信息,例如。 ++p
或p = ...
,因为这违反了您的承诺。
答案 3 :(得分:0)
是的,我相信。此处的附加const
仅表示在f
的实现中,不允许实现者重新分配p
以指向其他字符或C样式的字符串。