char * vs const char *作为参数

时间:2010-07-05 13:02:49

标签: c

当我使用char*而不是const char*时,有很多次出现编译错误。所以,我不确定实际的区别,语法和编译机制。

5 个答案:

答案 0 :(得分:47)

如果您追求两者之间的差异,只需将它们视为:

  • char * 是一个指针,指向包含char类型值的位置,该值也可以更改。可以改变指针的值,即可以修改指针以指向不同的位置。
  • const char * 是一个指针,其值也可以更改,指向包含无法更改的char类型值的位置。

答案 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字符的指针
  • const char * non-constant指向constant字符的指针
  • 字符* const constant指向non-constant字符的指针
  • const char * const constant to指向constant字符的指针


参考[link]

答案 4 :(得分:0)

我总是尝试使用const char*而不是char*定义参数,因为std::string方法可以轻松地从conts char*转换为.c_str()。但是,将std::string转换为char*并非易事。