從變量的聲明和定義看指針與const

聲明和定義

在c++中支持分離式編譯所以c++講聲明和定義區分開來,聲明是使得名字爲程序所知,定義負責創建於名字關聯的實體。變量聲明規定了變量的類型和名字,在這一點哈桑定義與之相同,此外定義還申請內存空間,也可能會爲變量賦初值。

一條聲明語句由一個基本數據類型和緊隨其後的一個聲明符列表組成。每個聲明符命名了一個變量並指定該變量是與基本數據類型有關的某種類型。

簡單的如

int a;

聲明符其實就是變量名,此時變量類型就是聲明的基本數據類型 int。

在複合類型的聲明定義中 如

int  *p;

int是基本數據類型,*p是聲明符,此聲明符命名了一個變量p並指出這個變量p是與基本數據類型int有關的某種類型,這種關係是 p是整型指針。

int a;

int &r=i;

&r是聲明符,命名了變量r,變量r與基本數據類型int有關,關係是 r是整型引用。

再來看指針和const

指針常量(const pointer)和指向常量的指針(pointer to const)(我覺得記英文更有助於理解)這兩個是經常容易混淆的概念

int *const pt1;//指針常量(const pointer)

int const *pt2;//指向常量的指針(pointer to const

pt1是指針常量,不能改變其所指向的對象的內容,其本身的內容可以改變。pt2是常量指針,指針本身的值不能改變,但其所指對象的內容可以改變。

再從複合類型的聲明角度來看,從右向左讀第一句聲明語句。離pt1最近的是const  pt1先被限定爲常量,聲明符*說明這個常量是一個基本數據類型int的指針,這樣就能理解pt1是一個常量指針,它本身是一個常量,它是一個指向整型的指針。

pt2是指向常量的指針。從右向左離pt2最近的是* 是聲明符的一部分,*說明pt2是指向基本數據類型的指針,再往前看 這個基本數據類型int 被const限定爲常量,所以pt2是一個指針,指向了一個整型常量。


關於指針和const再加一點。 指向常量的指針不一定要指向一個常量,而一個常量必須要用一個相應類型的指針來指。當一個常量指針指向一個非常量時,可以理解爲它以爲自己指向了一個常量,並且按照對常量的操作規則來約束自己。

int a;

int const *p=&a;

a=5;

*p=5;//error l-value specifies const object   雖然a本身並不是常量 但不能通過指向常量的指針p來對其賦值。



發佈了26 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章