首頁 > 軟體

C++常數指標,指標常數,指向常數的常指標詳解

2021-10-18 16:31:54

什麼是指標

指標就是指向變數在記憶體中的地址

資料是存放在記憶體中的,每一個變數都有一個記憶體地址,假設是一個int型別變數a,佔4個位元組的記憶體區,那麼在記憶體中如果是小端方式儲存,我們建立指標p,把a的地址賦值給p,就是把a的首地址0x1100賦值給指標p,這個時候p的值就是變數a在記憶體中的首地址

int a =10;
int*p;
p=&a; //把a的首地址賦值給P

也就是說指標的值是這塊記憶體區域的首地址

記憶體地址

記憶體是一個很大的,線性的位元組陣列,每一個位元組都是固定8個二進位制位組成,計算機對每個記憶體單元都進行了編號,這個編號就稱為記憶體地址,地址決定了記憶體單元在記憶體中的位置

指標所佔記憶體

32位元系統中,處理器一次能處理的最大位數是2的32次方 ,也就是一次處理4個位元組的記憶體資料,哪麼指標的長度也就是4個位元組。

64位元系統中,處理器一次能處理的最大位數是2的64次方 ,也就是一次處理8個位元組的記憶體資料,哪麼指標的長度也就是8個位元組。

32位元系統指標4個位元組 64位元系統8個位元組

const 變數

const 是 constant 的縮寫,本意是不變的,不易改變的意思

也就是說使用const修飾的變數,其值是不允許改變的

const int  a = 7; 
int  b = a; // 正確
a = 8;       // 錯誤,不能改變

指標常數,常數指標和指向常數的指標

在瞭解了上面的基礎知識之後,我們來看一下什麼是指標常數,常數指標和指向常數的指標

首先說一下怎麼快速的記住他們的區別,只需要按照命名的順序來讀,就可以很好地記憶

比方說:

int * const p =&a;

首先是一個指標int * , 然後一個const常數 那麼p就是指標常數

const int *p=&a;

首先是一個const常數, 然後一個指標int * 那麼p就是常數指標

是不是很好記憶

指標常數

int * const p =&a;

特點:指標的指向不可以修改,指標指向的記憶體的值可以修改

因為const的功能就是限定不可以修改,所以我們看到指標常數是先有了int *指標,再有的const修飾p 所以p的值(指向的記憶體地址) 是不可以修改的

也就是const限制的是指標p的值,但是沒有限定p指向的記憶體地址裡的資料,所以記憶體的資料可以修改

舉例:

int a=10;
int * const p =&a;  //定義指標常數,指向int a的地址
*p = 20; //正確,指向的記憶體地址中的資料可以修改   
p=&b;  //錯誤,指向的記憶體地址不可以修改

箭頭是指標指向的記憶體值,是不可以修改的,但是指向的記憶體地址中的資料可以修改

常數指標

const int *p=&a;

特點: 指標的指向可以修改,但是指標指向的值不可以修改。

常數指標,首先要是常數。就是指向的值要是一個常數,但是指向的記憶體地址不做限制

int a=10;
int b=10;
const int *p=&a;  //定義常數指標,指向int a的地址
*p = 20; //錯誤,指向的記憶體地址中的資料不可以修改   
p=&b;  //正確,指向的記憶體地址可以修改

箭頭是指標指向的記憶體值,是可以修改的,但是指向的記憶體地址中的資料要和之前的一致

指向常數的常指標

const int const *p=&a;

特點: 指標的指向不可以修改,指標指向的值也不可以修改。

兩個const限制,一旦指向之後就不可以做修改了

int a=10;
int b=10;
const int const *p=&a;  //定義指標常數,指向int a的地址
*p = 20; //錯誤,指向的記憶體地址中的資料不可以修改   
 p=&b;  //錯誤,指向的記憶體地址不可以修改

空指標、野指標

空指標就是指向地址為空的指標

注意:空指標指向的記憶體是不可以存取的

//-------空指標-------//
int *p4 = NULL;
//cout << *p4 << endl; //執行Error,使用指標時必須先判斷是否空指標

野指標是指標指向了一個隨意的記憶體地址,如果使用,會造成不可預知的記憶體錯誤

//-------野指標(懸浮、迷途指標)-------//
int *p5 =0x1100;  //任意賦值的野指標
//cout << *p5 << endl; //執行Error
int *p6 = new int(5);
delete p6;  //刪除p6的指向
p6 = NULL; //一定要有這一步,否則p6會隨機的指向一個地址


總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!


IT145.com E-mail:sddin#qq.com