3

我正在学习C语言。

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

size_t strlen(const char * string);

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

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

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

或者

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

还是根本没有区别?

4

3 回答 3

8

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

当您查看以下内容时,这一点更容易理解strcpy

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

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

于 2012-01-05T18:44:37.410 回答
4

strlen 函数的参数是一个指向 const 的指针,因为函数不应该改变指针指向的东西——它只需要对字符串做一些事情而不改变它。

在您的函数“timesTwo”中,如果您打算更改“num”指向的值,则不应将其作为指向 const 的指针传递。所以,使用第二个例子。

于 2012-01-05T18:46:49.540 回答
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
于 2012-01-05T20:14:34.583 回答