为什么strlen的参数是“常量”?

时间:2012-01-05 18:42:09

标签: c function pointers prototype strlen

我正在学习C语言。

我的问题是: 为什么strlen的参数是“常量”?

size_t strlen(const char * string);

我在想它是因为字符串是一个地址所以它在初始化后不会改变。如果这是正确的,这是否意味着每次使用指针作为参数构建函数时,它应该设置为常量?

就像我决定构建一个将int变量设置为double的函数一样,它应该被定义为:

void timesTwo(const int *num)
{
    *num *= 2;
}

void timesTwo(int *num)
{
    *num *= 2;
}

或者它没有任何区别?

3 个答案:

答案 0 :(得分:7)

C string是指向零终止字符序列的指针。 const前面的char *向编译器和调用函数的程序员指示strlen不会修改string指针所指向的数据。

当您查看strcpy时,这一点更容易理解:

char * strcpy ( char * destination, const char * source );

它的第二个参数是const,但它的第一个参数不是。这告诉程序员第一个指针指向的数据可能被函数修改,而第二个指针指向的数据在从strcpy返回时将保持不变。

答案 1 :(得分:4)

strlen函数的参数是一个指向const的指针,因为该函数不会改变指针所指向的内容 - 只能在不改变它的情况下对字符串执行某些操作。

在您的功能' timesTwo'中,如果您打算更改数字' num'指向,你不应该把它作为指针传递给const。所以,使用第二个例子。

答案 2 :(得分:4)

基本上,该函数承诺它不会通过该指针修改输入字符串的内容;它说表达式*string可能不会被写入。

以下是const限定符的各种排列:

const char *s;            // s may be modified, *s may not be modified
char const *s;            // same as above
char * const s;           // s may not be modified, *s may be modified
const char * const s;     // neither s nor *s may be modified
char const * const s;     // same as above