我正在学习C语言。
我的问题是: 为什么strlen的参数是“常量”?
size_t strlen(const char * string);
我在想它是因为字符串是一个地址所以它在初始化后不会改变。如果这是正确的,这是否意味着每次使用指针作为参数构建函数时,它应该设置为常量?
就像我决定构建一个将int变量设置为double的函数一样,它应该被定义为:
void timesTwo(const int *num)
{
*num *= 2;
}
或
void timesTwo(int *num)
{
*num *= 2;
}
或者它没有任何区别?
答案 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