为什么字符串函数有一些参数为const char *(指向常量字符的指针)?

时间:2016-10-10 22:52:04

标签: c

可以在C中修改字符串(字符数组),但不能修改字符串文字。但是为什么像strlen(const char * str)这样的字符串函数有一个指向常量字符的指针?

4 个答案:

答案 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作为只读字符串,然后执行计算并返回值不修改原始字符串,因为它为了计算字符串的长度,它不需要修改内存中的字符串。