Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以简单的方式修改常量char*与char*内容_C++_Char_Constants - Fatal编程技术网

C++ 以简单的方式修改常量char*与char*内容

C++ 以简单的方式修改常量char*与char*内容,c++,char,constants,C++,Char,Constants,我真的对常量char*和char*感到困惑。 我知道在char*中,当我们想要修改内容时,我们需要这样做 const char * temp = "Hello world"; char * str = new char[strlen(temp) + 1]; memcpy(str, temp, strlen(temp)); str[strlen(temp) + 1] = '\0'; char * str = "xxx"; char * str2 = "xts"; str = str2; 如果我

我真的对常量char*和char*感到困惑。 我知道在char*中,当我们想要修改内容时,我们需要这样做

const char * temp = "Hello world";
char * str = new char[strlen(temp) + 1];
memcpy(str, temp, strlen(temp));
str[strlen(temp) + 1] = '\0';
char * str = "xxx";
char * str2 = "xts";
str = str2;
如果我们想用这样的东西

const char * temp = "Hello world";
char * str = new char[strlen(temp) + 1];
memcpy(str, temp, strlen(temp));
str[strlen(temp) + 1] = '\0';
char * str = "xxx";
char * str2 = "xts";
str = str2;
我们收到了警告。没关系,我知道当我想改变字符时,我必须使用一些内存拷贝。但是关于const char,我真的很困惑。在const char*中,我可以使用这个

const char * str = "Hello";
const char * str2 = "World";
str = str2; // and now str is Hello

我没有编译器错误!为什么?为什么我们在非常量时使用内存复制,而在常量中只使用相等运算符!完成了!。。。怎么可能?在常量中使用equal可以吗?以后不会有问题吗?

这是早期C的遗留问题。早期C没有常量,所以字符串文字是char*。它们仍然是char*以避免破坏旧代码,但它们变得不可修改,所以除了名称之外,其他都是const char*。因此,现代C++警告或给出错误,当const被省略时严格遵守。 顺便说一句,您的memcpy遗漏了尾随的nul字节。使用strcpy复制字符串,这是具有正确名称的正确函数。您可以使用在读/写内存中创建字符串

char rwstring[] = "I am writeable";

语法。

这是因为变量只是一个指针*。您不是在修改它们的内容,而是在修改它们指向的位置

char * a = "asd";
char * b = "qwe";
a = b; 
现在你扔掉了a的内容。现在a和b指向同一个地方。如果修改一个,则两个都将被修改

换句话说。指针绝不是常量。指针变量中的const谓词对指针来说并不意味着什么

真正的区别在于,不是常量的指针指向常量变量。当您更改指针时,它将指向另一个新的常量变量。这就是const对简单指针没有影响的原因


注意:在更复杂的场景中,可以使用指针和常量实现不同的行为。但就这么简单而言,它基本上没有效果

正如其他答案所说,您应该区分指针和它们指向的字节

两种类型的指针char*和const char*都可以更改,即重定向到指向不同字节。但是,如果要更改字符串的字节字符,则不能使用const char*

因此,如果程序中有字符串文字Hello和World,可以将它们分配给指针,打印指针将打印相应的文字。但是,要执行任何非平凡的操作,例如将Hello更改为Hello,您将需要非常量指针

另一个示例:通过一些指针操作,可以从字符串文本中删除前导字节:

const char* str = "Hello";
std::cout << str; // Hello
str = str + 2;
std::cout << str; // llo
引用马尔科姆·麦克莱恩的话:


这是早期C的遗留问题,早期C没有常量,所以字符串文字是char*。它们仍然是char*以避免破坏旧代码,但它们变得不可修改,所以除了名称之外,其他都是const char*

事实上,字符串文字不是指针,而是数组,这就是sizeofhello world作为一个字符的原因,它包含了终止的空字符,而不是strlen。。。。除了这个小细节之外,即使在现在,上面的陈述对于好的旧C也是正确的

在C++中,字符串文字从一开始就一直是字符常量字符char const的数组:

C++标准,5.13.5.8:

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“array of n const char”,其中n是下面定义的字符串大小,具有静态存储持续时间

我强调了这一点。通常,不允许将指向常量的指针指定给指向非常量的指针:

char const* s = "hello";
char ss = s;
这将无法编译。将字符串文本分配给指向非常量的指针通常也会失败,正如标准在C.1.1子条款5.13.5中明确指出的那样:

更改:字符串文本变为常量。 字符串文字的类型从“字符数组”更改为“常量字符数组”。 [……]


尽管如此,编译器通常将字符串文字赋值给指向非常量的指针作为扩展!,可能是为了保持与C的兼容性。根据标准,这是无效的,编译器会产生一个警告,至少…

当您执行char*str=xxx时,您得到了什么特定的编译器警告;char*str2=xts;str=str2;?这可能有点帮助:指针不是常数,所以你可以改变它指向的,但是它指向的值是常数,所以你不能改变它。警告:ISO C++禁止将字符串常量转换为'char * [-WWREST字符串],这里不使用MeMCPY。使用StrucPy。使用STD::STRIGN。字符串文字是字符数组,现在它们是const char数组。不,现代C++在省略const时阻止编译。五年多以来,它一直是强制性的。我的编译器XCode是最新的,仍然发出警告,但编辑是为了反映。所以你说当我们创建一个新的char*,一个char类型在内存中创建,这个char*po
int到该字符存储,当我们将两个字符*设置为相等时,两个字符都指向该类型,但如果你这么说,为什么当我设置这个代码并想打印b时,我得到了qwe内容?????是的。当你做a=b时,它们都指向同一个qwe内存。更正您的注释,并且当我们将两个char*设置为相等时,指向同一个placepointer的两个点从来都不是常量,const对指针没有影响,这是一种夸张。常量指针char*const str=Hello有时很有用。是的,我同意。。。我会在答案上加一条注释。指针从来都不是常数,这不符合我的观点