当我使用char*
而不是const char*
时,有很多次出现编译错误。所以,我不确定实际的区别,语法和编译机制。
答案 0 :(得分:47)
如果您追求两者之间的差异,只需将它们视为:
答案 1 :(得分:24)
const 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
的某些原因。
答案 2 :(得分:1)
可能我太挑剔了。在我的书中,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 *是一个被更改的指针,当通过*或[]解除引用时,它不允许通过它进行写入。
答案 3 :(得分:1)
non-constant
指向non-constant
字符的指针non-constant
指向constant
字符的指针constant
指向non-constant
字符的指针constant
to指向constant
字符的指针
答案 4 :(得分:0)
我总是尝试使用const char*
而不是char*
定义参数,因为std::string
方法可以轻松地从conts char*
转换为.c_str()
。但是,将std::string
转换为char*
并非易事。