const char*, char const*, char*const 有何區別?
導讀 | const char*, char const*, char*const幾種容易混淆,以下筆記對三者的區別進行介紹。 |
Bjarne在他的The C++ Programming Language裡面給出過一個助記的方法: 把一個宣告從右向左讀。
char * const cp; ( * 讀成 pointer to ) cp is a const pointer to char const char * p; p is a pointer to const char; char const * p;
同上因為C++裡面沒有const*的運算子,所以const只能屬於前面的型別。
C++標準規定,const關鍵字放在型別或變數名之前等價的。
const int n=5; //same as below int const m=10; const int *p; //same as below const (int) * p int const *q; // (int) const *p char ** p1; // pointer to pointer to char const char **p2; // pointer to pointer to const char char * const * p3; // pointer to const pointer to char const char * const * p4; // pointer to const pointer to const char char ** const p5; // const pointer to pointer to char const char ** const p6; // const pointer to pointer to const char char * const * const p7; // const pointer to const pointer to char const char * const * const p8; // const pointer to const pointer to const char
說到這裡,我們可以看一道以前Google的筆試題:
const char *p="hello"; foo(&p); // 函式foo(const char **pp)下面說法正確的是[]
- A.函式foo()不能改變p指向的字串內容。
- B.函式foo()不能使指標p指向malloc生成的地址。
- C.函式foo()可以使p指向新的字串常量。
- D.函式foo()可以把p賦值為 NULL。
至於這道題的答案是眾說紛紜。針對上面這道題,我們可以用下面的程式測試:
#include#include#includevoid foo(const char **pp) { // *pp=NULL; // *pp="Hello world!"; *pp = (char *) malloc(10); snprintf(*pp, 10, "hi google!"); // (*pp)[1] = 'x'; } int main() { const char *p="hello"; printf("before foo %s/n",p); foo(&p); printf("after foo %s/n",p); p[1] = 'x'; return; }
結論如下:
- 在foo函式中,可以使main函式中p指向的新的字串常量。
- 在foo函式中,可以使main函式中的p指向NULL。
- 在foo函式中,可以使main函式中的p指向由malloc生成的記憶體塊,並可以在main中用free釋放,但是會有警告。但是注意,即使在foo中讓p指向了由malloc生成的記憶體塊,但是仍舊不能用p[1]='x';這樣的語句改變p指向的內容。
- 在foo中,不能用(*pp)[1]='x';這樣的語句改變p的內容。
所以,感覺gcc只是根據const的字面的意思對其作了限制,即對於const char*p這樣的指標,不管後來p實際指向malloc的記憶體或者常量的記憶體,均不能用p[1]='x'這樣的語句改變其內容。但是很奇怪,在foo裡面,對p指向malloc的記憶體後,可以用snprintf之類的函式修改其內容。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2710150/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++中string、char *、char[]、const char*的轉換C++
- const char*的全特化
- const char* 型別不能用於初始化char* 型別實體型別
- 【C++】CONST CHAR*型別的值不能用於初始化CHAR*型別的實體C++型別
- E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體型別
- VS C++ 2017中const char* 型別的值不能用於初始化char*的解決C++型別
- 【VS2019 C++】"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- 關於VS2017中const char *不能用於初始化char *型別的實體的問題型別
- 【筆記】VS2017中出現 "const char *" 型別的值不能用於初始化 "char *" 型別的實體筆記型別
- VS2019【C++報錯】E0144"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- C++中出現《E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體》的錯誤解決方法C++型別
- 一、char *const *(*next)();請對這行程式碼進行一下解釋?行程
- varchar和char的區別
- number----char(to_char)
- const * and * const
- MySQL中CHAR和VARCHAR區別MySql
- VS2019中出現E01104“const char *”型別的值不能用於初始化“char *”型別的實體的錯誤的解決辦法型別
- char
- let與const區別
- var let const區別
- let const var 區別
- let,const,var區別
- C語言 關鍵字const的作用 const int* 和int *const 的區別C語言
- const與static的區別
- var、const、let 的區別
- Rust中 String、str、&str、char 的區別Rust
- php中const和define有什麼區別PHP
- var和let/const的區別
- const、define 和 static 的區別
- var、let和const的區別
- JavaScript 高階—— ES6新增語法 const(let const var區別)JavaScript
- char *的使用
- NTMySQL中varchar和char型別的區別heeMySql型別
- 當char型變數遇上char*型的指標變數指標
- var、let和const三者有哪些區別?
- Const
- JavaScript中let、const、var 的區別JavaScript
- 頂層const和底層const