代码之家  ›  专栏  ›  技术社区  ›  Sunscreen

char*vs const char*作为参数

c
  •  34
  • Sunscreen  · 技术社区  · 14 年前

    当我使用 char* 而不是 const char* . 所以,我不确定实际的区别、语法和编译机制。

    4 回复  |  直到 9 年前
        1
  •  45
  •   Rob Wells    14 年前

    如果你想了解两者的区别,就把它们想成:

    • 烧焦* 指向包含也可以更改的char类型值的位置的指针。指针的值可以更改,即可以修改指针以指向不同的位置。
    • 常量字符 是一个指针,其值也可以更改,指向的位置包含char类型的值 不能 被改变。
        2
  •  23
  •   T.J. Crowder    14 年前

    const char * 表示“指向不可修改字符的指针”。通常用于不应修改的字符串。

    假设您正在编写此函数:

    int checkForMatch(const char * pstr)
    

    你已经(通过函数签名)承诺 不会改变 指的是 pstr . 现在假设检查匹配的一部分将涉及忽略字母大小写,并且在进行其他检查之前,您尝试将字符串转换为大写:

    strupr(pstr);
    

    如果说你不能这样做,你会得到一个错误,因为 strupr 被宣布为:

    char * strupr(char* str);
    

    …这意味着它希望能够写入字符串。您不能写入 常量字符 (这就是 const 是)。

    一般来说,你可以通过 char * 进入某个期望 常量字符 没有显式强制转换,因为这是一个安全的操作(为不打算修改的对象提供可修改的对象),但是 不能 通过A 常量字符 进入某个期望 烧焦* (没有明确的强制转换)因为这不是一件安全的事情(传递一些不应该被修改的东西到可以修改它的东西中)。

    当然,这是C,您可以在C中做任何事情,包括显式地强制 常量字符 到A 烧焦* -但那真的是, 真是馊主意 因为(大概)指针指向的东西 康斯特 .

        3
  •  1
  •   Peter G.    14 年前

    可能我太挑剔了。在我的书中,const char*指向的字符可能会被更改,但不能通过const char*进行更改。常量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*是一个可更改的指针,当通过*或[]取消引用时,它还允许通过它进行写入。

    常量char*是一个指针,当通过*或[]取消引用时,不允许通过它进行写入。

        4
  •  0
  •   Megidd    9 年前

    我总是试图用 const char* char* 因为转换自 std::string conts char* 容易被 .c_str() 方法。但是转换 STD::字符串 烧焦* 不是那么容易吗?