Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 常量字符*vs字符*_C++_String_Pointers - Fatal编程技术网

C++ 常量字符*vs字符*

C++ 常量字符*vs字符*,c++,string,pointers,C++,String,Pointers,我的书是这样说的: char *p="Hello"; //pointer is variable, string is constant *p='M'; // error p="bye"; // works 我在第二行中没有给我任何错误,在C++中也没有。 我在Windows 7上使用了Turbo C++。现在,如果我在gcc或其他方面进行尝试,上述情况是否属实 同样,如果书中正确解释了上述代码 #include<iostream.h> void display(char*); v

我的书是这样说的:

char *p="Hello"; //pointer is variable, string is constant
*p='M'; // error
p="bye"; // works
<>我在第二行中没有给我任何错误,在C++中也没有。 我在Windows 7上使用了Turbo C++。现在,如果我在gcc或其他方面进行尝试,上述情况是否属实

同样,如果书中正确解释了上述代码

#include<iostream.h>
void display(char*);
void display(const char*);
void main()
{
char* ch1="hello";
const char *ch2="bye";
display(ch1);
display(ch2);
}

void display(char* p)
{
cout << p << endl;
}

void display(const char* p)
{
cout << p << endl;
}
#包括
空白显示(字符*);
无效显示(常量字符*);
void main()
{
char*ch1=“你好”;
const char*ch2=“再见”;
显示器(ch1);
显示器(ch2);
}
无效显示(字符*p)
{

语言规范不是编译器向您做出的承诺,而是您和编译器共同签署的合同(当然,从隐喻的角度来说,这显然不是一个字面上具有法律约束力的合同)。如果您通过编写
*p='M';
违反合同,那么您触发了“未定义的行为”,并且您不能期望编译器有任何特定的行为:可能它会对它严格要求,并给您一个编译错误,可能它在运行时会变得不稳定……您没有遵守约定,现在允许它做任何它想做的事。另请参阅:。

问题:

“现在我的书考虑的是
char*
const char*
是相同的,因为如果是这样,那么上面的代码将不起作用,因为参数将是相同的?”

你可能是在歪曲你的书

可能不认为这些类型是相同的,因为它们是不一样的。

现在转到您的代码:

#include<iostream.h>
在文件顶部声明函数通常只会产生额外的工作。这通常意味着维护函数的两个声明。当您可以只处理一个声明时

void main()
<>标准C和标准C++ >代码>主< /代码> <强>不允许>具有任何其他结果类型,而不是<代码> int >

VisualC++是一个编译器,作为语言扩展,允许<代码>空洞 > 然而,使用这种可能性是相当愚蠢的,因为它更容易编写,只会使代码变得非标准,并且可能无法使用其他编译器进行编译

{
char* ch1="hello";
根据C++11规则,上述内容将不会编译。在C++98中已弃用,并在C++11中删除。但是,当前的编译器仍然允许使用此功能,但有些编译器会发出警告,可以打开

const char *ch2="bye";
display(ch1);
display(ch2);
}
尽管添加额外的
const
,如

    const char* const ch2="bye";
在C++中,P>是<强> >不可抗拒< /强>。正确的方法是<代码> const char */COD>。因为<代码>“hello”<代码>存储在只读区域中。此外,<代码> int main()>代码> int > main(int,char **)是定义<代码> main()/< > >的正确方法。

不要使用Turbo C,它是一个过时的编译器。使用gcc或MSVC。另外,不要使用提供此类错误信息的书籍

char *p="Hello"; //pointer is variable, string is constant
这段代码是允许的,因为早在C语言获得
const
关键字之前,它就一直有效

<>为了不破坏旧代码,C和C++标准只是记录了这应该像以前一样工作。
但是,如果你编写新代码,你应该使用正确的格式<代码> const char */COD> .< /P>字符串文字存储在不可变的内存中,C++强烈鼓励只使用代码> const char */Cux>来引用它们。@ KerrekSB,如果我不使用<代码> const char */COD>怎么办?它会自动类型化还是保留它?GCC告诉你T这里有一个“从
const char*
char*
的不推荐的转换”。无论您有什么,写入数据始终是未定义的行为。
    const char* const ch2="bye";
char* ch1="hello";
char *p="Hello"; //pointer is variable, string is constant