老的不能再老的問題

2021-04-18 09:13:39 字數 1953 閱讀 9844

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 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 #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 如下圖所示。對於每個字母,當我們可以由標為這個字母的圓盤為頂點,構成等邊三角形時,我們稱這個字...