之前對到底怎樣寫是常量指標(頂層const),怎樣寫不是,怎樣寫又是語法錯誤很糊塗,現在做個筆記。
《c++ primer》原文:很多程式設計師容易迷惑於基本資料型別和型別修飾符的關係,其實後者不過是宣告符的一部分罷了。
個人理解:int是基本資料型別,*是型別修飾符,*p是宣告符。
先總結一下各種情況:
1intconst *p1;//
正確,是指向常量的指標23
const
int *p1;//
正確,是指向常量的指標45
int *const p1;//
錯誤,常量指標必須初始化
67 *const
int p1;//
語法錯誤
89 *int
const p1;//
語法錯誤
1011
const* int p1;//
語法錯誤,以上是*、const和int的六種排列組合
1213
1415
using iptr=int*;
1617
const iptr p1;//
錯誤,常量指標必須初始化
1819 iptr const p1;//
錯誤,常量指標必須初始化
2021
2223
using cptr=const*;//
實際上等價於using cptr=const int*;
2425 cptr p1;//
正確,是指向常量的指標
2627
int cptr p1;//
語法錯誤
2829 cptr int p1;//
語法錯誤
3031
3233
using cptr= *const;//
語法錯誤
3435
using iptr= *int;//
語法錯誤
綜上,可知const直接修飾右邊的宣告符:
int const *p1;const int *p1;
兩句中的const都是修飾*p1,也就是說*p1不可變,但p1可以變,指標指向的值不可變,指標指向的記憶體位址可變
int *const p1;
這裡const修飾p1,所以是常量指標
using iptr=int*;const iptr p1;
這裡的const和上一例一樣
其實迷糊的根本就在於當初學的時候
int *p=0;
這一行**沒徹底弄明白
而對於int而言,int覺得自己是修飾*p的,所以p指向的記憶體裡面必須儲存int型別的變數,這時候*是解引用符
同樣,const修飾p,就成了常量指標,修飾*p,就成了指向常量的指標。
不管是什麼const int* p還是int *const p,只要看清楚*和變數名能不能黏到一塊去,或者說前面的型別說明符到底是修飾*p還是p的,就能弄清楚含義了
今天下午開工了個如何理清楚邏輯的一點感想,對於這篇文章而言,思路清晰的關鍵就是要知道*在一行**裡的兩種含義。
又想到了一點:
《c++ primer》裡面提到所謂指向常量的指標,只是指標以為自己指向的是常量,所以拒絕通過解引用的方式改變指向的物件的值,但實際上那個物件是不是常量,指標表示無所謂
結合中所說:
」const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。「
於是一切都豁然開朗起來:
我define了pi是3.14,但是我在**裡面還是可以寫c=3.14*d;
我定義了乙個指向常量的指標,但天知道那個指標指向的物件到底是不是常量呢~
說不定物件的心早就變了,可憐的底層const還在以為自己指向的是常量······
在這裡我們為底層const默哀一秒,祝天下渣男渣女原地**(笑)~~~~~~~
C Primer學習筆記
學習完乙個知識點後寫上自己的理解。算是總結吧,加深一下自己的印象,也可以在以後複習的時候方便檢視 加油加油!14.1關於運算子的過載 存在的意義 目前看來就是因為操作符大部分是針對資料的,比如int型,char型,書中稱為內建型別。而當類之間想要用操作符的時候,比如兩個類的物件相加,那麼就需要去重 ...
《C Primer》學習筆記
2008年7月18日 颱風海鷗登陸 1 宣告與定義 變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。變數的宣告用於向程式表明變數的型別和名字。變數的宣告包括物件名 物件型別和物件型別前的關鍵字extern 當設計標頭檔案時,記住定義和宣告的區別是很重要的...
c primer學習筆記
3.2 標準庫型別string 1.注意在使用empty size 和is x 這種函式時請注意其使用的方法,例如 string s hello world if s.empty empty 和size 更像是一種屬性 if is x s 0 is 這種函式更像是一種函式,而且是針對的單個字元 2....