2011-11-12 142 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*