首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >const char* vs char*

const char* vs char*
EN

Stack Overflow用户
提问于 2011-11-12 11:42:55
回答 4查看 3.2K关注 0票数 2

我的书是这样说的:

代码语言:javascript
运行
复制
char *p="Hello"; //pointer is variable, string is constant
*p='M'; // error
p="bye"; // works

嗯,在C中,我的第二行没有给我任何错误,在C++中也没有。

我在Windows7上使用的是Turbo C++。现在如果我尝试在gcc或其他系统上使用,上面的事情是真的。

同样在类似的行上,如果本书正确地解释了上述代码,

代码语言:javascript
运行
复制
#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;
}

我的书是不是认为char*const char*是一样的,因为如果是这样,那么上面的代码就不能工作了,因为参数将是相同的?

(虽然我在turbo +windows上得到了输出Hello bye。)

哪一个是正确的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-12 11:58:49

语言规范不是编译器向您做出的承诺,而是您和编译器都签署的相互合同。(当然,打个比方。显然,这不是一个具有法律约束力的合同。)如果你通过编写*p='M';违反了约定,那么你就触发了“未定义的行为”,你不能期望编译器有任何特定的行为:也许它会严格要求它,并给你一个编译错误,也许它只是在运行时变得不稳定。。。你没有遵守协议,现在它被允许做任何它想做的事情。另请参阅:http://catb.org/jargon/html/N/nasal-demons.html

票数 6
EN

Stack Overflow用户

发布于 2011-11-12 12:19:36

问题:

“现在我的书是不是认为char*const char*是一样的,因为如果是这样,那么上面的代码就不能工作了,因为参数将是相同的?”

你可能曲解了你的书。

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

现在来看你的代码:

代码语言:javascript
运行
复制
#include<iostream.h>

H不是标准C++的一部分。C++是在1998年标准化的,这个标准化取消了ARM时代的iostream.h。因此,现代编译器很可能会被这一点卡住。

作为一种变通办法,当您得到一个不那么古老的编译器时,您可以使用…

代码语言:javascript
运行
复制
    #include <iostream>
    using namespace std;

接下来,

代码语言:javascript
运行
复制
void display(char*);
void display(const char*);

在文件顶部声明函数通常只会产生额外的工作。这通常意味着维护函数的两个声明。当你只需要处理一个声明的时候。

代码语言:javascript
运行
复制
void main()

在标准C和标准C++中,main,不允许具有除int之外的任何其他结果类型。

作为一种语言扩展,Visual C++是一种允许使用void的编译器。

然而,使用这种可能性是非常愚蠢的,因为它更需要编写,并且只会使代码变得非标准,并且很可能无法使用其他编译器进行编译。

代码语言:javascript
运行
复制
{
char* ch1="hello";

根据C++11规则,上面的代码将无法编译。它在C++98中已被弃用,并在C++11中被移除。然而,AFAIK当前的编译器仍然允许它,但有些人有一个可以打开的警告。

代码语言:javascript
运行
复制
const char *ch2="bye";
display(ch1);
display(ch2);
}

上面的代码还可以,不过添加一个额外的const也没什么坏处,比如

代码语言:javascript
运行
复制
    const char* const ch2="bye";
票数 2
EN

Stack Overflow用户

发布于 2011-11-12 12:23:51

代码语言:javascript
运行
复制
char* ch1="hello";

在C++中不推荐使用的。正确的方法是const char*。因为"hello"存储在只读区域中。此外,int main()int main(int, char**)是定义main()的正确方式。

不要使用Turbo C,它是一个过时的编译器。去找gcc或者MSVC吧。此外,不要使用提供这种不正确信息的书籍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8102397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档