我們經常使用const來修飾資料型別,來保證資料的安全,甚至cosnt被用在函式引數處,保證資料的安全性,當指標跟const放在一起時,它又表示什麼作用呢?我們不妨寫個**看一看,首先我們給出乙個簡單的指標賦值的操作。
#include using namespace std;
int main()
{ int test = 6666;
int *p = &test;
cout<<*p《結果當然是輸出 6666了,最開始我學指標的時候,老喜歡直接對直接將指標指向乙個值,例如這樣寫
int *p = 6666;
這麼寫會有問題嗎?當然不行,你的ide聰明點會告警的,這是編譯器給出的錯誤,兩者型別不同當然不能進行賦值操作了。這裡我們可以做個模擬,把位址 比作房間號,資料比作房間裡的人,剛才的操作就像是,我的指標變數此時需要乙個房間號,而你卻直接給我來個人,我當然不要了。而之前的正確操作就類似於,我給你乙個房間號,碰巧房間裡還住了乙個人。
error: invalid conversion from 'int' to 'int*'好吧,理解這個我們言歸正傳,const與指標搭配會發生什麼樣的變化。
#include using namespace std;
int main()
{ int test = 6666;
const int *p = &test; //用const修飾
cout<<*p《先來猜猜上述的兩處修改值的操作,哪個是違法的呢?
不妨看看編譯結果吧!
error: assignment of read-only location '* p' *p = 7777;
這裡的意思是錯誤的分配了唯讀位置,也就是說const修飾後表示,我不管你這個指標變數指向了誰,我只保證你指向的位址的值我是不會修改的。
好搞定這點後,出個題測試一下自己掌握沒。
const int test = 6666;
const int * pt = &test;
cosnt int test = 6666;
int * pt = &test;
上面的題中,哪種操作是非法的呢?
當然是第二種,因為我們之前就說過,cosnt 這裡的修飾表示的意思是,指標指向的值不會發生改變,既然int型別的資料已經成為了可讀資料,而指標這裡卻沒有修飾,說明兩者是衝突的,當然非法了。
那肯定有人要問,那我能確保的指標指向的位址不發生改變嗎?不妨看下面的**
#include using namespace std;
int main()
{ int test = 6666;
int * const p = &test; //注意這裡的const的位置
cout<<*p《聰明的小夥伴已經猜到了
error: assignment of read-only variable 'p' p = &another;
這裡指標指向的位址唯讀,不可更改。
那我們把兩者放一起對比一下。
int test = 6666;
const int * p = &test; //指標指向的值唯讀
int test = 6666;
int * const p = &test; //指標的位址唯讀
其實很容易理解啦,我們定義指標時用到的兩個關鍵字拿出來分析下,int是說明這個指標變數將要指向的值的資料型別,而*表示這是乙個指標變數,那麼const的修飾位置就說明了一切,修飾int就表示指向的值不能更改,修飾*就表示指標的位址不可更改。如果我們需要兩者都不發生更改,那當然是用兩個const來修飾了。 c 指標與cosnt指標
建立乙個指標變數 不難理解,指標變數是乙個儲存位址的變數,位址指向另一塊記憶體,可以通過指標變數中儲存的位址,對該位址的記憶體進行操作 const修飾的指標可以分為三種 1.常量指標 2.指標常量 3.const同時修飾指標和常量 我覺得背起來很麻煩,為了更好的理解,不妨換乙個思路,回到指標poin...
C 中的指標陣列與陣列指標
指標陣列即為包含了多個指標的陣列 而陣列指標指的是指向陣列的指標。指標陣列中的每個元素都是指標,而多維陣列是陣列的陣列。因此,指標資料與多維陣列類似。指標陣列歸根到底也屬於陣列,因此,其定義的方式為 型別名 識別符號 陣列維數 只不過此時的型別名為指標型別。例如 int myarray 2 定義了乙...
C 中函式指標的使用
在c c 中存在著函式指標,即指向函式的指標。我目前已知的兩種使用方法是 include include typedef int pinnt define pp int int funca int a,int b int funcb int a,int b int main int argc,cha...