const char *是字符串还是指针

时间:2018-04-15 08:08:48

标签: c++ string pointers

我认为const char *表示一个指向不可变字符串的可变指针。

然而,当我这样做时,

#include <iostream>
using namespace std;

const char *name1 = "Alex";

int main() 
{
   name1 = "John";
   cout << name1 << endl;
}

它只是打印John并且没有显示任何问题。我想知道为什么程序将name1视为字符串并使其变为可变?

5 个答案:

答案 0 :(得分:5)

  

我想知道为什么程序将name1视为字符串并使其可变?

它没有,你只是为指针分配了一个新地址("John"的地址)。你自己说&#34;一个可变指针到一个不可变的字符串&#34; 。你修改了指针,并且你试图实际修改指针,类型系统会阻止你这样做(由于const限定符)。

答案 1 :(得分:3)

它是一个指针,通过将其分配给&#34; John&#34;,你可以指向另一个案例记忆,其中&#34; John&#34;启动。

答案 2 :(得分:2)

  • 这是一个指针
  • 指针是内存中的地址。
  • 在这里你重新分配&#34; John&#34; to name1。
  • cout知道如何打印char *以便您正确看到事物。

程序中没有字符串对象

答案 3 :(得分:2)

仅用于说明/比较(在添加中已经给出的答案):计数器示例......

const char *name1 = "Alex";

int main() 
{
    name1[0] = 'J';
    name1[1] = 'o';
    name1[2] = 'h';
    name1[3] = 'n';
    std::cout << name1 << std::endl;
    return 0;
}

现在你尝试来真正修改不可变的字符串。幸运的是,编译器检测到它并阻止你这样做! const_cast<char>(name[x]) = y;将是下一次尝试。看起来像愚弄编译器,实际上,你只是通过撒谎欺骗自己,结果遇到未定义的行为

实际上,抛弃const几乎总是一个坏主意(但是是合法的,如果并且只有指针保存了一些最初非const创建的内存的地址)。

答案 4 :(得分:0)

  

我想知道为什么程序将name1视为字符串并使其可变?

const相比,注意*的序列。如果您不允许重新绑定name1,请使用char * const。另请参阅What is the difference between const int*, const int * const, and int const *?

此外,const不是关于不可变的值,而是关于不可变的绑定。