C語言之const

明確const修飾的對象,如果const位于星號的左側(cè),則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位于星號的右側(cè),const就是修飾指針本身,即指針本身是常量。

C++ 對于指針p1,和p2,若要使得p2=p1成立,則可讀做 :

“p1是指向X類型的指針,p2是指向“帶有const限定”的X類型的指針 “。

char *p1;const *p2=p1;//合法:p1是指向(char)類型的指針,p2是指向“帶有const限定"的(char)類型的指針。

? ? ? ? char **p1;const? char**p2=p1;//不合法:p1是指向(char*)類型的指針,p2是指向 ((const char)*)類型的指針。

? ? ? ? char **p1;char const**p2=p1;//不合法;與上等價。

? ? ? ? char**p1;char*const*p2=p1;//合法:? p1是指向(char *)類型的指針,p2是指向“帶有const限定"的(char*)類型的指針。

這是C++語法規(guī)則,在C中因為char **可以轉(zhuǎn)換為const char**

————————————————

可以記憶的聲明

const char *p; //*p是const,p可變

const (char *) p;//p是const,*p可變

char* const p; //p是const,*p可變

const char* const p; //p和*p都是const

char const * p;// *p是const,p可變

(char*) const p;//p是const,*p可變

char* const p;// p是const,*p可變

char const* const p;// p和*p都是const

記憶方法

轉(zhuǎn)自 http://blog.csdn.net/swibyn/article/details/20052371

The C++ Programming Language里面給出過一個助記的方法:

把一個聲明從右向左讀。

char * const cp; ( * 讀成 pointer to) cp is a const pointer to char

const char * p; p is a pointer to constchar;

char const * p; 同上因為C++里面沒有const*的運算符,所以const只能屬于前面的類型。

————————————————

奇技淫巧:

方法也是從右向左一步一步來解釋,而且每一步都有返回值,是的你沒看錯,有返回值。每一步都相當于一個函數(shù),上一步的返回值即是下一步的入?yún)ⅰ?/p>

拿const char *p;來說吧

1,“p”:代表內(nèi)存的一塊空間,暫且稱為”內(nèi)存1”, 返回值當然是p了,也就是內(nèi)存1。

2, “*” :當p被星了之后,就跳到新的內(nèi)存位置,也就是“內(nèi)存2”。 內(nèi)存2就是我們說的*p, 這時返回值就是內(nèi)存2。

3,“char”: 因為上一步的返回值是內(nèi)存2,所以這個char就作用在內(nèi)存2上,就像是在說這里存的是一個char類型數(shù)據(jù)。 返回值還是內(nèi)存2。

4,“const” :上一步返回內(nèi)存2(具有char特點的內(nèi)存2),這時const就作用在內(nèi)存2上,結(jié)果就是說內(nèi)存2不能變了,他是常量。返回值還是內(nèi)存2(具有char特點和const特點的內(nèi)存2)。

5,如果前面還有修飾符,應(yīng)該可以這樣再推下去

————————————————

再來看個例子:

const (char *) p;

1, “p”:代表內(nèi)存的一塊空間,稱為”內(nèi)存1”,返回值當然是p,也就是內(nèi)存1。

2, “(char*)”: 整個修飾p,因為不是*,不會跳轉(zhuǎn)到新的內(nèi)存,所以返回值還是p,還是內(nèi)存1。

那“(char* )”什么意思呢,他相當于是一個自定義類型,就像一個自定義函數(shù),簡稱大函數(shù),由兩個小函數(shù)構(gòu)成。

函數(shù)1是“*”,函數(shù)2是“char”。

函數(shù)1“*”的處理結(jié)果是跳到另一塊內(nèi)存,即內(nèi)存2,返回值是內(nèi)存2。

函數(shù)2“char”的處理結(jié)果是說內(nèi)存2是char類型,返回值是內(nèi)存2。

只可惜這個返回值被大函數(shù)隔離了,大函數(shù)作為一個整體返回的是入?yún)⒌哪菈K內(nèi)存。

如果有一天這個大函數(shù)只有一個小函數(shù),這個小函數(shù)是“*”,即大函數(shù)數(shù)“(*)”,這時別以為“*”和“(*)”有什么區(qū)別,就是差個馬夾而已。

3,“const”:修飾上一步返回的內(nèi)存,即內(nèi)存1

注意:不要被這里的內(nèi)存1,內(nèi)存2誘導(dǎo),我可沒說給他們開辟空間了,聲明時是不開辟空間的。

只有在實際賦值之后,內(nèi)存1,內(nèi)存2才有對應(yīng)的實際的內(nèi)存空間。

所以聲明,只是在使用之前先描述一下這個變量具有什么特點,如何來使用這個變量而已。

所以不管是說內(nèi)存1是const,或內(nèi)存2是const,并不是說實際的那塊內(nèi)存真的就不能改了(實際上也做不到)。

這里對聲明的變量賦值實際上是提供了對某塊內(nèi)存訪問的一個方法。Const,char都是描述了這個方法的一些特點;而“*”的作用是跳轉(zhuǎn)到另一塊內(nèi)存。

————————————————


原文鏈接:https://blog.csdn.net/u010144805/article/details/78547515

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容