[英]why it cannot convert char* to char
在 C++ 中,我們可以寫
1 個char *s="hello"
但以下程序行產生錯誤(無法將 char* 轉換為 char)
2個char *s; *s="hello";
char *s; *s="hello";
我在這里很困惑,為什么會出現此錯誤,1 和 2 之間有什么區別?
在 C++ 中,字符串文字是字符的常量數組,而不僅僅是像 C 中的字符數組。無論如何,要分配給這樣的變量(最好避免這種情況),您不必取消引用指針。 取消引用它會訪問第一個元素,它只是一個字符。 char 不能在其中包含字符數組,從而導致錯誤。 這更多是您應該使用std::string
。
一些編譯器(例如 GCC)提供了擴展以使此類代碼成為可能,因為它不是符合標准的代碼,它看起來像:
char* s = "hello";
s = "new string";
這會在GCC 中生成以下警告(但仍然得到預期的結果):
警告:ISO C++ 禁止將字符串常量轉換為 'char*' [-Wwrite-strings]
Clang也具有相同輸出的相同行為(同時生成警告)
字符串是一個字符數組。 因此,字符串的開頭是const char *
。 因此,要引用字符串,可以使用const char * s = "hello";
但是,如果您取消引用const char*
,則會得到一個const char
。 這不是一個字符串,即*s
給你 'h'。
在你的代碼中*s="hello";
,你說的是“在被取消引用的地方分配值”你好“”。 取消引用 s 只是一個字符,您正在嘗試為其分配一個字符串。
問題是第二個示例中的第二個星號。
第一個代碼是這樣的
char *s="hello";
等效代碼是這樣的
char *s;
s="hello";
第二行中的s
前沒有*
。
現在每個人都指出這些都不是合法的 C++。 正確的代碼是
const char *s="hello";
或者
const char *s;
s="hello";
因為字符串文字是常量,所以你需要一個指向const char
的指針。
我在這里很困惑,為什么會出現此錯誤,1 和 2 之間有什么區別?
與 C++ 中的許多其他*
在不同的上下文中意味着不同的東西一樣:
char *s; // * here means that s type is a pointer to char, not just char
*s; // in this context * means dereference s, result of exression is char
int a = 5 * 2; // in this context * means multiply
因此案例 1 和案例 2 可能看起來與您相似,但它們的含義非常不同,因此會出現錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.