C語言 指標常量和常量指標的區別

2021-09-21 18:45:19 字數 1686 閱讀 2976

標題列出了5個概念,以指標為一組,常量為一組的兩組概念內部是非常容易混淆的。希望以本文來清晰區分它們。

一. const限定符

將const理解為乙個修飾詞似乎更容易理解一些。一旦出現const,一定要看清楚它究竟修飾的是什麼。雖然這句話比較抽象且模糊,但接下來所述的所有內容將舉出例子,理解下面的內容就會理解這句話的含義。

如下面所看到的,所有涉及指標的概念為一組(即常指標和指標常量為一組),涉及引用的概念為一組(引用、常引用、引用常量)。

非常清楚這些內容的人可能會說:沒有引用常量這個說法。這裡我們暫且先這樣說,後文將會闡述清楚這個說法不存在的事實。

二. 常指標和指標常量

首先能看到這篇文章的讀者一定清楚:const是常量,是「唯讀」而「不可寫」的。這個說法毋庸置疑的正確,然而不夠具體,因為語法上可能會出現問題,例如這節說的「常指標」和「指標常量」。

永遠不要死記硬背,下面的**只是為了先看下「常指標」和「指標常量」在語法上長什麼樣子:

1 const int* pt  //常指標

2 int* const pt; //指標常量

很顯然,這兩者區別就是const的位置,當然也可以說是int*位置的不同,但是int*代表int型別的指標,再看之前所說的const理解為乙個修飾詞,可以試著理解下面的話:

常指標const int* pt中const修飾int*,連起來說就是「常整型指標」,但是隨著指標指向的資料型別不同這個說法也將隨之改變,例如const char* pt就是「常字元型指標」,因此省略中間的指標指向的資料型別名,統一稱為「常指標」。

再來看常指標的作用。仍然以const int* pt為例:const修飾了int*,並未直接修飾pt,也就是說指標變數pt並不是「唯讀」的,而說的是pt是指向整型常量的指標,指標指向的資料不可更改。因此常指標的作用是保護指向的資料不被更改。

如果理解了常指標,指標常量就比較好理解了:int* const ps中,const修飾指標ps本身,因此指標ps就是「唯讀」的,不能再改變指標本身的值,也即不能改變指標的指向,但指向的資料卻是能更改的。

三.常引用和引用常量

常引用和引用常量實際上跟常指標和指標常量基本一致,只不過這裡把指標換成了引用就可以了,並且作用與常指標和指標常量是一致的,因此不再贅述。但是要說明:實際上不存在引用常量這個說法,也不存在引用常量這個東西。可以嘗試在vs中作如下定義:

int a=0;

int& const b=a;

編譯時並不會報錯,但是會有如下提示

warning : 使用了記時錯誤: 忽略引用上的限定符

而當去掉const時此警告就會消失,也就說明了其實並不存在引用常量這個東西。

實際上這就涉及了乙個問題:引用的本質是什麼?

一般教科書上說:引用就是「別名」。確實這個說法沒有大問題。但這並不是本質。

引用不佔據記憶體空間這種說法是錯的,如果反編譯看彙編**,會發現引用實際上被解釋為乙個指標常量,而這也恰好符合引用本身不能更改的原則。

這樣看引用常量不存在的原因很明顯了:引用本身就被解釋為指標常量,再用const修飾完全沒有意義。

總結:

常量指標:指向常量的指標。

指標常量:指標型別的常量。

c語言指標常量和常量指標的區別

1.常量指標const在指標符號之前 一般用來修飾形參,防止所傳的實參被修改 int a 10 int b 20 const int p a 指標的指向可以改變,不可以直接修改指標所指的值,可以間接修改指標所指的值,p b 是非法的 p a 是合法的 a 20 是合法的 2.指標常量指標的指向不能被...

c 常量指標和指標常量區別

const double cptr 這裡的cptr是乙個指向double型別const物件的指標,const限定了cptr指標所指向的物件型別,而並非cptr本身。也就是說cptr本身並不是const。在定義時不需要對它進行初始化,如果需要的話,允許給cptr重新賦值,使其指向另乙個const物件。...

C 常量指標和指標常量的區別

首先是乙個常量,其次該常量是個指標。因為是乙個指標型別的常量,所以定義時必須初始化乙個變數的位址,且始終指向該位址不能被更改即只能賦值一次,但位址中存放的內容可以被更改。通過以下例子了解指標常量的特性 int a,b int const p a 指標常量初始化 p 10 操作成功,指標常量所指位址的...