C++ 二級指標與 const 關鍵字

2022-09-14 06:03:04

可用七種不同的方式將 const 關鍵字用於二級指標,如下所示:

//方式一:所指一級指標指向的資料為常數,以下幾種為等效表示
const int ** pptc;    //方式一
int const ** pptc;    //方式二

//方式二:所指一級指標為常數
int *const* pcpt;

//方式三:二級指標本身為常數,需在宣告時初始化
int x = 55;
int * pt = &x;
int ** const cppt = &pt;

//方式四:二級指標本身為常數,所指一級指標也為常數,所指一級指標指向的資料也為常數,需在宣告時初始化
int x = 55;
const int * pt = &x;
const int *const* const cpcptc = &pt;

//方式五:二級指標本身為常數,所指一級指標也為常數,需在宣告時初始化
int x = 55;
int * pt = &x;
int *const* const cpcpt = &pt;

//方式六:二級指標本身為常數,所指一級指標指向的資料也為常數,需在宣告時初始化
int x = 55;
const int * pt = &x;
const int ** const cpptc = &pt;

//方式七:所指一級指標為常數,所指一級指標指向的資料也為常數
int x = 55;
const int * pt = &x;
const int *const* pcptc = &pt;

Microsoft Visual Studio 中連續多個 const 會被編譯器解釋成一個,即 const const const const int**const int** 等效,除此之外,const int const**Microsoft Visual Studio 中也與 const int** 等效。

以上七種型別指標的特性如下:

  • 型別為 const int ** 的指標 pptc 表示 **pptc 為常數,不能用該指標修改所指一級指標指向的資料的值,但可修改其所指一級指標的值,也可修改其所指向的地址(指標自身的值),只能將 const int * 型別的一級指標地址、const int **const int ** const 型別的二級指標值賦給 pptc
  • 型別為 int * const * 的指標 pcpt 表示 *pcpt 為常數,能用該指標修改所指一級指標指向的資料的值,不可修改其所指一級指標的值,但可修改其所指向的地址(指標自身的值),只能將 int *int * const 型別的一級指標地址、int **int ** constint * const *int * const * const 型別的二級指標值賦給 pcpt
  • 型別為 int ** const 的指標 cppt 表示 cppt 為常數,能用該指標修改所指一級指標指向的資料的值,也可修改其所指一級指標的值,但不可修改其所指向的地址(指標自身的值),只能將 int * 型別的一級指標地址、int **int ** const 型別的二級指標值賦給 cppt,且必須在宣告時初始化。
  • 型別為 const int *const* const 的指標 cpcptc 表示 **cpcptc*cpcptccpcptc 都為常數,不能用該指標修改所指一級指標指向的資料的值,不可修改其所指一級指標的值,也不可修改其所指向的地址(指標自身的值),能將 int *int * constconst int *const int * const型別的一級指標地址、const int **const int ** constint **int ** constint * const *int * const * constconst int * const *const int *const* const 型別的二級指標值賦給 cpcptc,且必須在宣告時初始化。
  • 型別為 int *const* const 的指標 cpcpt 表示 *cpcptcpcpt 都為常數,能用該指標修改所指一級指標指向的資料的值,不可修改其所指一級指標的值,也不可修改其所指向的地址(指標自身的值),能將 int *int * const 型別的一級指標地址、int **int ** constint * const *int * const * const 型別的二級指標值賦給 cpcpt,且必須在宣告時初始化。
  • 型別為 const int ** const 的指標 cpptc 表示 **cpptccpptc 都為常數,不能用該指標修改所指一級指標指向的資料的值,可修改其所指一級指標的值,但不可修改其所指向的地址(指標自身的值),只能將 const int * 型別的一級指標地址、const int **const int ** const 型別的二級指標值賦給 cpptc,且必須在宣告時初始化。
  • 型別為 const int *const* 的指標 pcptc 表示 **pcptc*pcptc 都為常數,不能用該指標修改所指一級指標指向的資料的值,也不可修改其所指一級指標的值,但可修改其所指向的地址(指標自身的值),能將 int *int * constconst int *const int * const型別的一級指標地址、const int **const int ** constint **int ** constint * const *int * const * constconst int * const *const int *const* const 型別的二級指標值賦給 pcptc

對於型別為 int ** 的常規指標,有以下特性:

  • 型別為 int ** 的指標 ppt 表示 **ppt*pptppt 都不為常數,能用該指標修改所指一級指標指向的資料的值,也可修改其所指一級指標的值,也可修改其所指向的地址(指標自身的值),只能將 int * 型別的一級指標地址賦給 ppt

各型別二級指標的可修改屬性如下表所示:

指標型別 修改 **pt 修改 *pt 修改 pt
const int ** pt 不可以 可以 可以
int * const * pt 可以 不可以 可以
int ** const pt 可以 可以 不可以
int ** pt 可以 可以 可以
const int *const* const pt 不可以 不可以 不可以
int * const * const pt 可以 不可以 不可以
const int ** const pt 不可以 可以 不可以
const int * const * pt 不可以 不可以 可以

若將一級指標的地址賦予二級指標,各型別二級指標可接受的一級指標地址如下表所示:

指標型別 int *地址 const int *地址 int * const地址 const int * const地址
const int ** pt 不可以 可以 不可以 不可以
const int ** const pt 不可以 宣告時可以 不可以 不可以
int ** pt 可以 不可以 不可以 不可以
int ** const pt 宣告時可以 不可以 不可以 不可以
int * const * pt 可以 不可以 可以 不可以
int * const * const pt 宣告時可以 不可以 宣告時可以 不可以
const int * const * pt 可以 可以 可以 可以
const int *const* const pt 宣告時可以 宣告時可以 宣告時可以 宣告時可以

若將二級指標的值賦予二級指標,各型別二級指標可接受的二級指標值如下表所示:

指標型別 const int ** const int ** const int ** int ** const int * const * int * const * const const int * const * const int *const* const
const int ** pt 可以 可以 不可以 不可以 不可以 不可以 不可以 不可以
const int ** const pt 宣告時可以 宣告時可以 不可以 不可以 不可以 不可以 不可以 不可以
int ** pt 不可以 不可以 可以 可以 不可以 不可以 不可以 不可以
int ** const pt 不可以 不可以 宣告時可以 宣告時可以 不可以 不可以 不可以 不可以
int * const * pt 不可以 不可以 可以 可以 可以 可以 不可以 不可以
int * const * const pt 不可以 不可以 宣告時可以 宣告時可以 宣告時可以 宣告時可以 不可以 不可以
const int * const * pt 可以 可以 可以 可以 可以 可以 可以 可以
const int *const* const pt 宣告時可以 宣告時可以 宣告時可以 宣告時可以 宣告時可以 宣告時可以 宣告時可以 宣告時可以