您好,登錄后才能下訂單哦!
本篇內容主要講解“c++中const char*, char const*, char*const的區別是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“c++中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之類的函數修改其內容。
到此,相信大家對“c++中const char*, char const*, char*const的區別是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。