Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ 在c+中使用带有字符串的char*+;_C++_Implicit Conversion_Cout_Assignment Operator_String Literals - Fatal编程技术网

C++ 在c+中使用带有字符串的char*+;

C++ 在c+中使用带有字符串的char*+;,c++,implicit-conversion,cout,assignment-operator,string-literals,C++,Implicit Conversion,Cout,Assignment Operator,String Literals,我正在使用以下代码 #include <iostream> using namespace std; int main() { char* Our_String; Our_String = "This is a string"; cout << Our_String; return 0; } #包括 使用名称空间std; int main() { char*我们的_字符串; 我们的_String=“这是一个字符串”;

我正在使用以下代码

#include <iostream> 
using namespace std;
int main()
{
    char* Our_String;
    Our_String = "This is a string";
    cout << Our_String;
    return 0;
}
#包括
使用名称空间std;
int main()
{
char*我们的_字符串;
我们的_String=“这是一个字符串”;
不能包含
使用名称空间std;
int main()
{
char const*我们的_字符串;
我们的_String=“这是一个字符串”;
不能包含
使用名称空间std;
int main()
{
char const*我们的_字符串;
我们的_String=“这是一个字符串”;

cout将字符串文字转换为
char*
的过程是错误的。编译器可能编译此代码(并发出警告)或根本不编译它

假设这已被接受。如果在赋值后尝试更改
我们的_字符串
中的一个字符,会发生什么情况?无法更改字符串文字,因为它作为常量存储在二进制文件中。
您甚至可以看到这一点。更改为
const char*
并编译代码。然后,在文本编辑器中打开已编译的可执行文件,您应该能够找到“这是一个字符串”字符串通过简单的文本搜索。

将字符串文字转换为
char*
的过程是。编译器可能编译此代码(并发出警告)或根本不编译它

假设这已被接受。如果在赋值后尝试更改
我们的_字符串
中的一个字符,会发生什么情况?无法更改字符串文字,因为它作为常量存储在二进制文件中。
你可以看到这一点。将更改为< C++ > const char */COD>并编译代码。然后,在文本编辑器中打开编译后的可执行文件,并且<强>你应该能够用简单的文本搜索找到“这是一个字符串”<强>。(虽然在这两种语言中,您不能更改字符串文字。)

表达式中使用的数组(很少有例外)被转换为指向其第一个元素的指针

所以在这个表达式语句中

Our_String = "This is a string";
字符串文本具有类型
const char[17]
,并隐式转换为类型
const char*

但是,由于此声明,带有赋值运算符的表达式的左操作数的类型为
char*

char* Our_String;
不能将指向常量对象的指针指定给指向非常量对象的指针

因此,您需要像这样重写上面的声明

const char * Our_String;
在这种情况下,赋值的两个子表达式将具有相同的类型
const char*

另一种方法是声明一个数组而不是指针,并用字符串文本初始化它,例如

char Our_String[] = "This is a string";
然后你可以像输出指针一样输出它

cout << Our_String;

> c> <> C++中的C字串中的C有固定字符数组的类型(虽然在两种语言中都不可能改变字符串文字)。 表达式中使用的数组(很少有例外)被转换为指向其第一个元素的指针

所以在这个表达式语句中

Our_String = "This is a string";
字符串文本具有类型
const char[17]
,并隐式转换为类型
const char*

但是,由于此声明,带有赋值运算符的表达式的左操作数的类型为
char*

char* Our_String;
不能将指向常量对象的指针指定给指向非常量对象的指针

因此,您需要像这样重写上面的声明

const char * Our_String;
在这种情况下,赋值的两个子表达式将具有相同的类型
const char*

另一种方法是声明一个数组而不是指针,并用字符串文本初始化它,例如

char Our_String[] = "This is a string";
然后你可以像输出指针一样输出它

cout << Our_String;

cout Missing
const
。正如编译器已经告诉您的那样。使用
char-const*我们的字符串;
“const-char*”和“char-const*”都工作正常“我做错了什么?”不使用<代码> STD::String const < /C>。正如编译器已经告诉过的。使用“代码> char const *url string;< /c> > const char *”和“char const *”这两个都很好地工作“我做什么了。”不使用<代码> STD::String 。尝试用C++编写C。“字符串文字是常量字符*的数组”是一个错误的语句。:)它不是指针数组。它是
字符常量的数组(实际字符,而不是指针)。数组可以分解为指向第一个元素的指针,在本例中,第一个元素是“字符常量”,因此数组->ptr转换会产生一个
字符常量*
,这是真的,我还在编辑答案。我想现在更清楚了,不必再碰“衰减为指针”感谢输入。这个转换在C++ 98和C++ 03中被禁止;它在C++ 11中被删除。如同任何不符合C++标准要求的代码,一致编译器必须发出一个诊断。这样做后,它可以自由编译代码,具有特定的实现意义。“字符串文字是常量字符*的数组”是一个错误的语句。:)它不是指针数组。它是
字符常量的数组(实际字符,而不是指针)。数组可以分解为指向第一个元素的指针,在本例中,第一个元素是“字符常量”,因此数组->ptr转换会产生一个
字符常量*
,这是真的,我还在编辑答案。我想现在更清楚了,不必再碰“衰减为指针”感谢输入。这个转换在C++ 98和C++ 03中被删除;它在C++ 11中被删除。如同任何不符合C++标准要求的代码,一致编译器必须发出一个诊断。这样做,可以自由编译代码,具有特定的实现意义。的代码被视为不完整。请解释所做的更改以及p