3

我在读这个:const char * const vs const char *?

在 中string.hstrlen定义为:

size_t strlen ( const char * str );

如果我理解正确,strlen 需要一个指向 const 字符的指针。不应该是:

size_t strlen ( const char* const str );

这将确保 strlen 不能修改指针以指向不同的指针?

或者,是不是这样:

由于 str 指针将按值传递给 strlen,因此函数中对该指针的任何更改都不会更改源指针,因此没关系..

??

4

3 回答 3

12

如果你真的阅读了那个讨论,你应该明白第二个const对函数的外部行为没有影响。对于你,用户来说,不管是声明还是参数strlen,都没有任何区别。正如您正确指出的那样,可能对指针进行的任何修改都只会影响内部指针的内部本地副本。无论参数是否以 second 声明,您传递给的参数指针都将保持不变。(您的参数指针甚至不必是左值。)const char *const char *conststrlenstrlenstrlenconst

第二个const只会影响函数内部局部参数变量的内部行为,防止作者修改strlen该局部变量。他们是否想以这种方式限制自己,非正式地说,是他们自己的事。它不strlen以任何方式关注用户。

事实上,由于顶级const限定符对函数类型没有影响,因此通常可以使用参数声明一个函数,const char *然后使用参数定义const char *const。编译器(链接器)仍会将这些声明视为“匹配”。这意味着如果库作者如此需要,他们实际上可以strlen使用const char *const参数进行定义。他们根本没有告诉你,因为这实际上是一个实现细节,或者strlen,即你不需要知道的东西。

于 2012-07-26T16:56:11.000 回答
2

由于 str 指针将按值传递给 strlen,因此函数中对该指针的任何更改都不会更改源指针,因此没关系..

是的。这只是对函数内部处理的限制。

这将确保 strlen 不能修改指针以指向不同的指针?

不需要,指针是按值传递的。

于 2012-07-26T16:58:04.983 回答
2

size_t strlen ( const char* const str );

这将确保 strlen 不能修改指针以指向不同的指针?

您自己解释了原因:strlen 无法修改指针...。

它不必要地对参数施加了限制,该参数可用于在修改指针本身时计算长度,如:

 size_t len = 0;
 while(*str)
 {
   ++len;
   ++str; //error if `const char *const str` is used!
 }

请参阅strlen()glibc中修改指针本身的实现:通过将其分配给可修改的指针类型。

另请参阅OpenBSD库实现:

size_t strlen(const char *str)
{
    const char *s;

    for (s = str; *s; ++s)
        ;
    return (s - str);
}

如果是类型,这里s=str会出错!strconst char * const

于 2012-07-26T17:06:21.710 回答