const char*, char const*, char*const的區別問題幾乎是c++面試中每次都會有的題目。 事實上這個概念誰都有,只是三種宣告方式非常相似很容易記混。 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 belowint const m=10;
const int *p; //same as below const (int) * pint 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 #include void foo(const char **pp) int main()
結論如下:
在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之類的函式修改其內容。
我的老同桌
生活總是充滿奇遇與巧合,這正是生活的樂趣。坐在家裡不怎麼舒服的椅子上查乙個jsf的問題,右手的食指突然抖了一下,進入了某個 我毫不猶豫的想將其關掉,滑鼠的指標突然停住了。我用ibm的鍵盤滑鼠輕輕移動指標,乙個名字突然進入視線,觸動了我久違的記憶 寇慧婷。這是我的老同桌,小學坐了三年,從她轉到八小後就...
我們老的很快
月光靜靜地瀉在寢室的地板上,反射著二重月光。空中有點發黃的燈將這個不大的房間照的很是明亮。夜很靜有著平時體會不到的靜,就連宿舍裡都沒有平時敲鍵盤的聲音,只有走廊裡偶爾傳來一陣陣腳步聲。呆呆的自己坐在寫字檯前,看著去年剛剛開學的所做的那一疊課堂筆記,輕輕的彈去表面的灰塵,新的一樣。突然間又有了昨天的記...
老曹的憂鬱
description 我們的主角 老曹,現在十分憂鬱。原因是他在玩乙個困難的遊戲。遊戲規則如下 有 n 1 n 2個圓盤,在平面上擺成了乙個變長為n個圓盤的等邊三角形。每個圓盤上標有乙個小寫字母 a z 如下圖所示。對於每個字母,當我們可以由標為這個字母的圓盤為頂點,構成等邊三角形時,我們稱這個字...