我正在读这个:const char * const versus const char *?
<{1>}中的,strlen定义为:
string.h
如果我理解正确,strlen需要一个指向const的char的指针。不应该是:
size_t strlen ( const char * str );
这样可以确保strlen不能修改指针指向不同的指针吗?
或者,是这样的:
由于str指针将通过值传递给strlen,因此函数中对此指针的任何更改都不会更改源指针,因此它没关系..
...
答案 0 :(得分:11)
如果你真的读过那个讨论,你应该明白第二个const
对函数的外部行为没有影响。对于您,strlen
的用户,无论是使用const char *
还是const char *const
参数声明它都没有任何区别。正如您所正确指出的那样,strlen
可能对指针执行的任何修改只会影响strlen
内指针的内部本地副本。无论参数是否以第二个strlen
声明,您传递给const
的参数指针都将保持不变。 (你的参数指针甚至不必是左值。)
第二个const
只会影响函数内局部参数变量的内部行为,阻止strlen
的 authors 修改该局部变量。他们是否想要以这种方式限制自己是非正式地说,他们自己的事业。它不以任何方式涉及strlen
的用户。
事实上,由于顶级const
限定符对函数类型没有影响,因此通常可以声明具有const char *
参数的函数,然后使用const char *const
参数定义它。编译器(链接器)仍将这些声明视为“匹配”。这意味着如果库作者如此需要,他们实际上可以使用strlen
参数定义const char *const
。他们根本就没有告诉你这个,因为这实际上是一个实现细节或strlen
,即你不需要知道的事情。
答案 1 :(得分:2)
由于str指针将通过值传递给strlen,因此函数中对此指针的任何更改都不会更改源指针,因此它没关系..
是。这只是内部处理功能的限制。
这样可以确保strlen不能修改指针指向不同的指针吗?
不需要,指针按值传递。
答案 2 :(得分: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!
}
请参阅glibc中strlen()
的实现,它修改指针本身:将其指定给可修改的指针类型。
另见OpenBSD lib实施:
size_t strlen(const char *str)
{
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
}
如果s=str
为str
类型,则const char * const
会出错!