我认为const char *表示一个指向不可变字符串的可变指针。
然而,当我这样做时,
#include <iostream>
using namespace std;
const char *name1 = "Alex";
int main()
{
name1 = "John";
cout << name1 << endl;
}
它只是打印John并且没有显示任何问题。我想知道为什么程序将name1视为字符串并使其变为可变?
答案 0 :(得分:5)
我想知道为什么程序将name1视为字符串并使其可变?
它没有,你只是为指针分配了一个新地址("John"
的地址)。你自己说&#34;一个可变指针到一个不可变的字符串&#34; 。你修改了指针,并且你试图实际修改指针,类型系统会阻止你这样做(由于const限定符)。
答案 1 :(得分:3)
它是一个指针,通过将其分配给&#34; John&#34;,你可以指向另一个案例记忆,其中&#34; John&#34;启动。
答案 2 :(得分:2)
程序中没有字符串对象
答案 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
不是关于不可变的值,而是关于不可变的绑定。