有很多次,当我使用 char*
而不是 const char*
时,会出现编译错误。所以,我不确定它们之间的真正区别、语法和编译机制。
有很多次,当我使用 char*
而不是 const char*
时,会出现编译错误。所以,我不确定它们之间的真正区别、语法和编译机制。
如果你想要区分这两者的不同,可以把它们理解为:
char *
指针而不是const char *
指针向内存写入。 - T.J. Crowderconst char*
有几个原因。其中一个是它可以记录您的代码不会修改所指向的数据。另一个原因是,它将防止您在不经意间(例如由于打错符号,如=
而不是==
,或者输错变量名称)写入您本不想修改的地方。此外,这也可能帮助编译器确定可进行的优化(但如果编译器已经足够智能,则可能没有这种必要)。 - R.. GitHub STOP HELPING ICEconst char *
参数时,如果函数不需要修改传递的字符串,则可能*允许编译器进行无法执行的优化。 - T.J. Crowderint main()
{
const char* str = "Original string.";
strcpy(str, "New string."); //error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|
return 0;
}
- pkthapachar
数组再次尝试。 - syockitconst char *
的意思是“指向不可修改的字符”的指针。它通常用于不应被修改的字符字符串。
假设你正在编写这个函数:
int checkForMatch(const char * pstr)
通过函数签名,你已经承诺不会更改pstr
所指的内容。现在假设匹配的一部分需要忽略字母的大小写,并且你尝试在进行其他检查之前将字符串转换为大写:
strupr(pstr);
你会收到一个错误,提示你不能这样做,因为strupr
被声明为:
char * strupr(char* str);
这意味着它希望能够写入字符串。你不能写入 const char *
中的字符(这就是 const
的作用)。
一般来说,你可以将一个 char *
传递给期望一个 const char *
的函数或方法而不需要显式地进行强制类型转换,因为这是安全的(将可修改的内容传递给不打算修改它的代码)。但是你不能将一个 const char *
传递给期望一个 char *
的函数或方法(不经过显式转换) ,因为这是不安全的(将不打算被修改的内容传递给可能会修改它的代码)。
当然,这是 C 语言,你可以在 C 中做任何事情,包括显式地将 const char *
转换为 char *
— 但这是一个非常,非常糟糕的想法,因为指针所指向的东西很可能有某些原因被标记为 const
。
char ch = 'A';
是一个变量(ch
),它包含一个可以更改的字符。因此,char *
是指向可以更改的字符的指针。同样地,const char ch = 'A';
是一个变量(ch
),用于存储您无法更改的字符,因此const char *
是指向您无法更改的字符的指针(通常意味着它是指向以空字符结尾的字符串的指针,但这不一定是这种情况)。 - T.J. Crowder我总是尝试使用const char*
来定义参数,而不是char*
,因为通过.c_str()
方法将std::string
转换为const char*
很容易。然而,将std::string
转换为char*
并不那么容易。
可能我太挑剔了。在我的书中,由const char*指向的字符可能会被更改,但不能通过const char*进行更改。const char*可以指向可修改的存储。例如:
char a[] = "abracadabra";
const char * ccp = &a[0]; // ccp points to modifiable storage.
*&a[0] = 'o'; // This writes to a location pointed to by const char* ccp
所以,我的措辞是:
char * 是一个指针,可以被更改,并且在通过 * 或 [] 解除引用时也允许写入。
const char * 是一个指针,可以被更改,并且在通过 * 或 [] 解除引用时不允许写入。
const char *
也可以简单地转换为普通的 char *
来写入地址。这并不意味着写入将成功;例如指针可能指向不可写内存。但是,如果通过任何其他方式写入该地址具有明确定义的行为,则删除 const 限定符并以这种方式编写也具有明确定义的行为。它对于实现像 strstr
这样需要能够处理 char *
和 const char *
参数并在返回的指针中保留非 const 特性的函数非常有用。 - R.. GitHub STOP HELPING ICE