可以在C中修改字符串(字符数组),但不能修改字符串文字。但是为什么像strlen(const char * str)这样的字符串函数有一个指向常量字符的指针?
答案 0 :(得分:3)
因为他们不修改(并且不需要修改)他们的参数字符串。这就是name: 'ReqlQueryLogicError',
msg: 'Cannot convert NUMBER to SEQUENCE',
frames: [],
message: 'Cannot convert NUMBER to SEQUENCE in
的含义。
如果const
的参数声明为strlen
(无char *
),则无法使用const
来确定常量字符串的长度。例如
strlen
将该参数声明为size_t my_own_strlen(char *str) { /* whatever */ }
const char hello[] = "Hello";
size_t l1 = my_own_strlen(hello); // Error: cannot convert `const char *` to `char *`
size_t l2 = strlen(hello); // OK
使const char *
适用于常量和非常量字符串。
答案 1 :(得分:2)
const T* p
表示p
指向的内存无法通过变量p
修改。它代表了p
不会用于修改指向的内存的承诺。这并不意味着p
指向永远无法修改的内存。
从T*
转换为const T*
:
T value;
T* q = &value; // Not const.
const T* p = q; // No cast necessary.
p = &value; // No cast necessary here either.
因此,如果字符串函数没有改变其参数,那么将其参数声明为const char*
是没有害处的:
const char* s = "string literal";
strlen(s); // This is legal.
char buf[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
strlen(buf); // This is legal too.
但是,如果参数被声明为char*
,那么您 无法将const char*
传递给它。
void foo(char* s);
const char* s = "string literal";
foo(s); // This will fail to compile.
因此,如果可能的话,记住使用const
来限定指针参数是有利的,并且这样做会证明函数承诺不会改变指针对象。
答案 2 :(得分:1)
它只是意味着该函数不会修改指针指向的数据。为您提供一些类型安全性和编译器优化机会。
答案 3 :(得分:0)
strlen(const char *str)
有一个指向常量字符的指针,因为它会将输入*str
作为只读字符串,然后执行计算并返回值不修改原始字符串,因为它为了计算字符串的长度,它不需要修改内存中的字符串。