const char*const与const char*?

pic*_*ict 101 c c++

我正在运行一些示例程序来重新熟悉C++,我遇到了以下问题.首先,这是示例代码:

void print_string(const char * the_string)
{
    cout << the_string << endl;
}

int main () {
    print_string("What's up?");
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,print_string的参数可能已经改为const char * const the_string.哪个更合适呢?

我理解不同之处在于,一个是指向常量字符的指针,而另一个是指向常量字符的常量指针.但为什么这两个都有效呢?什么时候相关?

Ken*_*art 233

后者阻止你修改the_string内部print_string.它实际上在这里是合适的,但也许冗长会推迟开发者.

char* the_string:我可以改变char到哪个the_string点,我可以修改char它指向的位置.

const char* the_string:我可以改变char到哪个the_string点,但我不能修改char它指向的位置.

char* const the_string:我无法改变char到哪个the_string点,但我可以修改char它指向的位置.

const char* const the_string:我不能改变char到哪个the_string点,也不能修改char它指向的位置.

  • 最后一句话+1.正确性是冗长的,但非常值得. (11认同)
  • 我有点尴尬我显然是唯一一个不理解这一点的人......但是"它指向的char**到**"与"**的char**"之间的区别是什么?点"? (10认同)
  • @Xeo:你的形式更加令人困惑,因为它完全改变了它的含义.`const char*`要好得多,因为`const`在完全相反的一侧. (6认同)
  • @R ..:嗯,至少对我来说不是.从右到左阅读,我得到"指向const char的指针".对我来说,这样的感觉更好. (6认同)
  • 好吧,你自欺欺人,因为C类型是从里到外读取的,而不是从左到右读取的.:-) (6认同)
  • @mskfisher:我强迫自己编写`char const*`的一个原因. (5认同)
  • -1表示不清楚; 答案对书面来说真是无益(尽管它不值得称之为愚蠢).建议:更改"const char*the_string:我可以更改the_string指向的char,但我无法修改它指向的char." to"const char*the_string:我可以更改指针,但不能更改它所指向的char." 等等 (5认同)
  • 当我第一次阅读时,我发现很难理解"与哪个"和"哪个"之间的区别. (4认同)
  • 实际上,它很容易阅读和理解。它指向的字符**-&gt;使指针完全指向另一个位置。它所指向的char ** at **-&gt;修改指针所指向的char。但是没有理由感到尴尬。唯一缺少的部分是使指针本身不是const没什么大不了的,因为它是按值传递的(传递了地址的副本),所以这是无害的,因此更改它可能不合适,但不会影响用户。 (3认同)
  • 如果您正在阅读诸如“char const * const”与“const char * const”(可编译且等效)之类的代码,从右向左阅读可能会让您感到困惑。您可以遵循一个简单的经验法则:const 修改(构造?)其左侧的内容。如果那里什么都没有,那就是它右边的东西。 (2认同)
  • 我不得不说我更喜欢James Michael Hare对这个问题的回答.这个答案中的措辞让我很困惑. (2认同)

Jam*_*are 130

  1. 指向可变字符的可变指针

    char *p;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 指向常量字符的可变指针

    const char *p;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 指向可变字符的常量指针

    char * const p; 
    
    Run Code Online (Sandbox Code Playgroud)
  4. 指向常量字符的常量指针

    const char * const p;
    
    Run Code Online (Sandbox Code Playgroud)

  • @NulledPointer否.C++声明从右到左形成.因此,您可以将`const char*p`读作:"p是指向字符常量的指针"或指向常量字符的可变指针,正如James正确指出的那样.与第二个相同:). (2认同)

Naw*_*waz 27

const char * const意味着指针以及指针指向的数据,有两个常量!

const char *表示只有指针指向的数据是const.然而,指针本身不是const.

例.

const char *p = "Nawaz";
p[2] = 'S'; //error, changing the const data!
p="Sarfaraz"; //okay, changing the non-const pointer. 

const char * const p = "Nawaz";
p[2] = 'S'; //error, changing the const data!
p="Sarfaraz"; //error, changing the const pointer. 
Run Code Online (Sandbox Code Playgroud)


Gar*_*ett 18

(我知道这已经过时了,但无论如何我想分享.)

只是想详细说明Thomas Matthews的回答.C类型声明的左右规则几乎说:当读取C类型声明时,从标识符开始,然后在可以时向右移动,在不能时向左移动.

最好用几个例子来解释:

例1

例2

例1337

进一步说明:http://www.unixwiz.net/techtips/reading-cdecl.html


Tho*_*ews 12

很多人建议从右到左阅读类型说明符.

const char * // Pointer to a `char` that is constant, it can't be changed.
const char * const // A const pointer to const data.
Run Code Online (Sandbox Code Playgroud)

在两种形式中,指针指向常量或只读数据.

在第二种形式中,指针不能改变; 指针总是指向同一个地方.