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

可用七種不同的方式將 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 聲明時可以 聲明時可以 聲明時可以 聲明時可以 聲明時可以 聲明時可以 聲明時可以 聲明時可以