在c++學習使用過程中,每個人都不可避免地使用指標,而且都或多或少的接觸過常量指標或指標常量,但是對這兩個的概念還是很容易搞糊塗的。
本文即是簡單描述指標常量和常量指標的區別。
常量指標
定義:
又叫常指標,可以理解為常量的指標,也即這個是指標,但指向的是個常量,這個常量是指標的值(位址),而不是位址指向的值。
關鍵點:
1.常量指標指向的物件不能通過這個指標來修改,可是仍然可以通過原來的宣告修改;
2.常量指標可以被賦值為變數的位址,之所以叫常量指標,是限制了通過這個指標修改變數的值;
3.指標還可以指向別處,因為指標本身只是個變數,可以指向任意位址;
**形式:
int const* p; const int* p;
指標常量
定義:
本質是乙個常量,而用指標修飾它。指標常量的值是指標,這個值因為是常量,所以不能被賦值。
關鍵點:
1.它是個常量!
2.指標所儲存的位址可以改變,然而指標所指向的值卻不可以改變;
3.指標本身是常量,指向的位址不可以變化,但是指向的位址所對應的內容可以變化;
**形式:
int* const p;
指向常量的常指標
定義:指向常量的指標常量就是乙個常量,且它指向的物件也是乙個常量。
關鍵點:
1.乙個指標常量,指向的是乙個指標物件;
2.它指向的指標物件且是乙個常量,即它指向的物件不能變化;
**形式:
const int* const p;
那如何區分這幾類呢? 帶兩個const的肯定是指向常量的常指標,很容易理解,主要是如何區分常量指標和指標常量:
一種方式是看 * 和 const 的排列順序,比如
int const* p; //const * 即常量指標
const int* p; //const * 即常量指標
int* const p; //* const 即指標常量
還一種方式是看const離誰近,即從右往左看,比如
int const* p; //const修飾的是p,即p的內容不可通過p改變,但p不是const,p可以修改,p不可修改;
const int p; //同上
int* const p; //const修飾的是p,p是指標,p指向的位址不能修改,p不能修改,但*p可以修改;
看**:
複製**
1 //-------常量指標-------
2 const int *p1 = &a;
3 a = 300; //ok,仍然可以通過原來的宣告修改值,
4 //*p1 = 56; //error,p1是const int的,不可修改,即常量指標不可修改其指向位址
5 p1 = &b; //ok,指標還可以指向別處,因為指標只是個變數,可以隨意指向;
67 //-------指標常量-------//
8 int const p2 = &a;
9 a = 500; //ok,仍然可以通過原來的宣告修改值,
10 p2 = 400; //ok,指標是常量,指向的位址不可以變化,但是指向的位址所對應的內容可以變化
11 //p2 = &b; //error,因為p2是const 指標,因此不能改變p2指向的內容
1213 //-------指向常量的常量指標-------//
14 const int const p3 = &a;
15 //*p3 = 1; //error
16 //p3 = &b; //error
17 a = 5000; //ok,仍然可以通過原來的宣告修改值
複製**
在實際應用中,常量指標要比指標常量用的多,比如常量指標經常用在函式傳參中,以避免函式內部修改內容。
size_t strlen(const char* src); //常量指標,src的值不可改變;
char a = 「hello」;
char b = 「world」;
size_t a1 = strlen(a);
size_t b1 = strlen(b);
雖然a、b是可以修改的,但是可以保證在strlen函式內部不會修改a、b的內容。
既然講到了指標,那順便說一下空指標、野指標的問題。
空指標就是儲存位址為空的指標,使用指標時必須先判斷是否空指標,很多問題都是這一步導致的。
野指標是在delete掉指標之後,沒有置0,導致指標隨意指向了乙個記憶體位址,如果繼續使用,會造成不可預知的記憶體錯誤。
另外指標的誤用很容易造成bug或者記憶體洩漏。
看**:
複製**
1 //-------空指標-------//
2 int *p4 = null;
3 //printf("%d",*p4); //執行error,使用指標時必須先判斷是否空指標
45 //-------野指標(懸浮、迷途指標)-------//
6 int *p5 = new int(5);
7 delete p5;
8 p5 = null; //一定要有這一步
9 printf("%d",*p5); //隱藏bug,delete掉指標後一定要置0,不然指標指向位置不可控,執行中可導致系統掛掉
1011 //-------指標的記憶體洩漏-------//
12 int *p6 = new int(6);
13 p6 = new int(7); //p6原本指向的那塊記憶體尚未釋放,結果p6又指向了別處,原來new的記憶體無法訪問,也無法delete了,造成memory leak
複製**
C 中指標常量和常量指標的區別
在c 學習使用過程中,每個人都不可避免地使用指標,而且都或多或少的接觸過常量指標或指標常量,但是對這兩個的概念還是很容易搞糊塗的。本文即是簡單描述指標常量和常量指標的區別。常量指標 定義 又叫常指標,可以理解為常量的指標,也即這個是指標,但指向的是個常量,這個常量是指標的值 位址 而不是位址指向的值...
c語言中指標常量和常量指標的區別
1 指標常量 主語是常量,定語是指標,所以這是乙個常量,乙個指標型別的常量。定義的時候必須初始化 char const p b const 修飾的是p,所以p是個常量,指標常量。是常量的話,值就是固定的,不能被改變,否則就是變數了,所以p p p c,都是錯誤的。char a 2 a就是乙個指標常量...
C 中指標常量與常量指標
指標是一種特殊的變數,它裡面儲存的內容是記憶體位址。常量是指其裡面儲存的內容不能發生改變的量。明白了這兩個概念後,我們現在正式進入指標常量與常量指標。1.指標常量與常量指標的概念 指標常量就是指標本身是常量,換句話說,就是指標裡面所儲存的內容 記憶體位址 是常量,不能改變。但是,記憶體位址所指向的內...