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

2022-02-06 05:30:44 字數 3159 閱讀 3403

在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

//-------常量指標-------

2const

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.指標常量與常量指標的概念 指標常量就是指標本身是常量,換句話說,就是指標裡面所儲存的內容 記憶體位址 是常量,不能改變。但是,記憶體位址所指向的內...