const char*是字符串还是指针?

4
我认为const char*表示一个可变指针,指向一个不可变字符串。
然而,当我执行以下操作时:
#include <iostream>
using namespace std;

const char *name1 = "Alex";

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

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


1
这里的“string”是指“字符数组,以零结尾”的意思,而不是std::string的意思。指针是可变的。要创建一个常量指针,请使用const char * const name1 = "Alex"; - Eljay
5个回答

5
我不明白为什么程序将name1作为字符串处理并使其可变?
实际上并没有,你只是给指针分配了一个新地址(即“John”的地址)。你自己说了:“一个不变字符串的可变指针”。你修改了指针,如果你试图实际修改指针所指向的内容,类型系统会阻止你这样做(因为有const限定符)。

1
实际上,它是一个可变指针,指向位于可执行文件的文本部分中的字符数组的不可变字符。 - JVApen

3

这是一个指针,通过将其分配给“John”,您使其指向另一个内存位置,该位置是以“John”开头的。


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创建的内存的地址,则是合法的)。


我认为下一步尝试并不是让每个人都使用const_cast :) - Rakete1111
@Rakete1111 嗯,你觉得后面的句子不够明确吗? - Aconcagua
我只是想要搞笑一下,我觉得还可以 :) - Rakete1111

2
  • 它是一个指针
  • 指针是内存中的地址。
  • 在这里,你将“John”的地址重新分配给了name1。
  • cout知道如何打印char *,所以你能正确地看到事情。

程序中没有字符串对象。


0
我想知道为什么程序将name1视为字符串并使其可变?
请注意const与*的顺序。如果您想禁止重新绑定name1,请使用char * const。另请参见“const int *,const int * const和int const *之间有什么区别?”
此外,const不是关于值不可变,而是关于不可变绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接