2011-11-12 56 views
2

这里是我的书说:为const char * VS字符*

char *p="Hello"; //pointer is variable, string is constant 
*p='M'; // error 
p="bye"; // works 

那么,在C我的第二个行不给我任何错误,无论是在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; 
} 

现在我的图书考虑char*const char*一样的,因为如果是那么上面的代码将无法正常工作,因为参数将是相同的?

(虽然我得到的涡轮增压+窗口输出你好再见。)

哪一个是正确的?

+1

字符串文字存储在不可变的内存中,C++强烈建议仅使用const char *来引用它们。 –

+0

@KerrekSB如果我不使用'const char *'会怎么样?它会自动对它进行类型转换还是保持原样? – Kraken

+2

GCC告诉你有一个“从const char *'到'char *'”的弃用转换。无论你有什么,*写入数据总是未定义的行为。 –

回答

6

语言规范不是编译器对您做出的承诺,而是您和编译器双方签署的双方合同。 (当然是隐喻地说,这显然不是一个具有法律约束力的合同)。如果你违反了合同,通过编写*p='M';,那么你触发了“未定义的行为”,并且你不能指望编译器的任何特定行为:也许它会严格对待它,并给你一个编译错误,也许它会在运行时变得诡异。 。 。你并没有阻止交易的结束,并且它可以按照现在的意愿做任何事情。另见:http://catb.org/jargon/html/N/nasal-demons.html

+0

哈哈好隐喻 –

1

问:

“现在我的图书考虑char*const char*一样的,因为如果是那么上面的代码不得工作,因为参数会是一样的吗? ”

那么你’重新可能歪曲你的书。

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

我们您的代码:

#include<iostream.h> 

[iostream.h]不是标准C++的一部分。 C++在1998年被标准化,而标准化取消了ARM时代的[iostream.h]。所以现代编译器可能会窒息。

作为一个解决方法,当你让自己不那么古老的编译器,你可能会......“

#include <iostream> 
    using namespace std; 

接下来,

void display(char*); 
void display(const char*); 

在文件的顶端声明功能通常只产生额外的工作。它通常意味着维护函数的两个声明。如果你能处理一个声明。

void main() 

在标准C和标准C++ main不允许到具有任何其它类型的结果比int

Visual C++是一种编译器,作为语言扩展,它允许void

但是,它使用这种可能性非常愚蠢,因为它更多的是编写代码,并且使得代码非标准化,并且可能无法与其他编译器一起编译。

{ 
char* ch1="hello"; 

通过C++ 11条规则,上面不会编译。它在C++ 98中被弃用,并在C++ 11中被删除。然而,AFAIK目前的编译器仍然允许它,但有一些有可以打开的警告。

const char *ch2="bye"; 
display(ch1); 
display(ch2); 
} 

以上是OK,但它不会伤害添加一个额外的const,像

const char* const ch2="bye"; 

干杯&心连心,

0
char* ch1="hello"; 

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

不要使用Turbo C,它是一个过时的编译器。去gcc或MSVC。另外,请勿使用提供这些不正确信息的书籍。

0
char *p="Hello"; //pointer is variable, string is constant 

此代码是允许的,因为它早在C语言获得const关键字之前一直有效。

为了不破坏旧代码,C和C++标准只是记录了这应该像以前一样工作。

但是,如果您编写新代码,则应使用适当的格式const char*