char*vs const char*作为参数

Sun*_*een 37 c

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

Rob*_*lls 48

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

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

  • 使用`const char*`有几个原因.一个是它记录了您的代码不会修改指向的数据.另一个是它会无意中阻止你(例如由于`=`而不是`==`或键入错误的变量名称的错字)写在你不想要的地方.它*可以*帮助编译器确定可以进行的优化(但如果编译器已经足够智能,可能不会). (12认同)
  • 那么,使用'const char*'有什么意义呢? (4认同)

T.J*_*der 24

const char *表示"指向不可修改字符的指针".它通常用于不应修改的字符串.

假设您正在编写此功能:

int checkForMatch(const char * pstr)
Run Code Online (Sandbox Code Playgroud)

你已经承诺(通过函数签名)你不会改变指向的东西pstr.现在说检查匹配的部分将涉及忽略字母的情况,并且您尝试通过在执行其他检查之前将字符串转换为大写来执行此操作:

strupr(pstr);
Run Code Online (Sandbox Code Playgroud)

你会得到一个错误,说你做不到,因为strupr声明为:

char * strupr(char* str);
Run Code Online (Sandbox Code Playgroud)

......这意味着它希望能够写入字符串.你不能写入a中的字符const char *(这就是const它的用途).

在一般情况下,你可以通过一个char *到的东西,需要一个const char *没有明确造型,因为这是做(说漏嘴修改的东西,不打算修改)一个安全的事情,但你不能传递const char *到什么期待char *(没有明确的演员),因为这不是一件安全的事情(传递一些不能被修改成可以修改它的东西).

当然,这是C,而你能做的只是用C任何东西,包括明确铸造const char *char * -但是这将是一个非常,非常糟糕的主意,因为有(大概)一些原因,东西被指向的指针是const.

  • @Sunscreen:“char ch = 'A';”是一个变量(“ch”),其中包含可以更改的字符。所以“char *”是一个指向可以更改的字符的“指针”。以完全相同的方式,“const char ch = 'A';”是一个您*无法*更改的字符的变量(“ch”),因此“const char *”是一个指向的“指针”您*不能*更改的字符(这通常意味着它是指向它们的以空结尾的字符串的指针,尽管情况不一定如此)。 (2认同)

Yas*_*Yas 5

  • char *       :non-constant指向non-constant字符的指针
  • const char *    :non-constant指向constant   字符的指针
  • char *const     :constant   指向non-constant字符的指针
  • const char * const :constant   指向constant   字符的指针


参考[链接]