C Primer筆記 頂層const 常量指標

2022-09-08 02:18:09 字數 1921 閱讀 8089

之前對到底怎樣寫是常量指標(頂層const),怎樣寫不是,怎樣寫又是語法錯誤很糊塗,現在做個筆記。

《c++ primer》原文:很多程式設計師容易迷惑於基本資料型別和型別修飾符的關係,其實後者不過是宣告符的一部分罷了。

個人理解:int是基本資料型別,*是型別修飾符,*p是宣告符。

先總結一下各種情況:

1

intconst *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....