第二个const在void f(char const * const p)中是否重要?

时间:2016-03-27 19:04:41

标签: c pointers const

声明的函数

void f(const char * const p) { ... }

表示它需要一个指向常量字符的常量指针。但是,如果变量p仅限于函数本身,并且其用法对被调用者隐藏,那么第二个const是否存在则很重要?

换句话说,从被调用者的角度看,下面的语义是否与第一个语义相同?

void f(const char *p) { ... }

4 个答案:

答案 0 :(得分:2)

第二个const*之后的那个)从被调用者的角度来看并不重要。

但从功能体的角度来看它确实很重要。 第二个const确保您不能使指针改变其值(即指向不同的存储位置)。

它可以将简单的原始参数声明为const,就像void f(const int value) {}

一样

答案 1 :(得分:2)

第一个const表示您无法更改指向的数据,第二个表示此指针无法覆盖。

所以,对于这个函数的调用者来说,它并不重要。 对于函数的实现,它可能很有用,但它只会在本地生效。

答案 2 :(得分:1)

是。您告诉编译器您不会修改该函数中的p。这允许编译器进行某些优化,例如,如果p已经在寄存器中,则无需保存,也无需分配新的寄存器。

如果您尝试修改p,它还会导致编译器发出诊断信息,例如。 ++pp = ...,因为这违反了您的承诺。

答案 3 :(得分:0)

是的,我相信。此处的附加const仅表示在f的实现中,不允许实现者重新分配p以指向其他字符或C样式的字符串。