C++Prime:ポインタとconst

4244 ワード

参照と同様に、ポインタを定数または非常量に向けることもできます.定数参照と同様に、ポインタが指すオブジェクトの値を変更するために使用できません.定数オブジェクトのアドレスを保存するには、定数を指すポインタしか使用できません.
const double pi = 3.14;    // pi    ,       

double *ptr = π    //   ,ptr        

const doublt *cptr = π    //   ,cptr           

*cptr = 42;    //   ,   *cptr  

  
定数を指すポインタを非常量のオブジェクトに向けることができます.
double dval = 3.14;    // dval         ,       

cptr = &dval;    //   ,      cptr  dval  

定数参照と同様に、定数を指すポインタも、その指すオブジェクトが定数でなければならないことを規定していません.定数を指すポインタとは、そのポインタによってオブジェクトの値を変更できないことのみを要求し、そのオブジェクトの値を他の方法で変更できないことを規定していない.
 
constポインタ:
ポインタはオブジェクトではなく参照されるため、他のオブジェクトタイプのようにポインタ自体を定数にすることができます.定数ポインタは初期化されなければならず、初期化が完了すると、その値(つまりポインタに格納されているアドレス)は変更されません.*をconstキーワードの前に置いてポインタが定数であることを説明するために使用されます.このような書く形式には、ポインタ自体の値ではなくポインタ自体の値が変わらないという意味が隠されています.
int errNumb = 0;

int *const curErr = &errNumb;`// curErr     errNumb 

const doublr pi = 3.14159;

const double *const pip = π    // pip              

この例では、curErrに最も近い記号はconstであり、curErr自体が定数オブジェクトであることを意味し、オブジェクトのタイプは宣言子の残りの部分によって決定される.宣言子の次の記号は*で、curErrが定数ポインタであることを意味し、最後に、この宣言文の基本データ型部分は定数ポインタがintオブジェクトを指していることを決定します.これと同様にpipは定数ポインタであり、オブジェクトが二重精度浮動小数点型定数を指す.
ポインタ自体が定数であるということは、ポインタによってその指すオブジェクトの値を変更させることができないという意味ではありません.そうすることができるかどうかは、指すオブジェクトのタイプに完全に依存します.例えば、pipは定数を指す定数ポインタであり、pipが指すオブジェクト値もpip自身が格納しているアドレスも変更できない.逆に、curErrは一般的な非常量整数を指しており、errNumbの値をcurErrで完全に修正することができる.
*pip = 2.72;    //   ,pip          



if(*curErr)

{

    *curErr = 0;    //   , curErr         

}

 
最上位const:
ポインタ自体はオブジェクトであり、別のオブジェクトを指すこともできます.したがって,ポインタの能力が定数であるかどうか,およびポインタが指す定数が1つであるかどうかは,2つの相互に独立した問題である.名詞の最上位constでポインタ自体を表すのは定数であり,名詞の最上位constでポインタが指すオブジェクトを表すのは定数である.
最上位constは、算術タイプ、クラス、ポインタなど、任意のオブジェクトが定数であることを表すことができます.下位constは、ポインタや参照などの複合タイプの基本タイプ部分に関連しています.
上記の例について説明します.
最上位constとは、定義されたオブジェクト自体が定数であるか否かを指し、最上位constとは、定義されたオブジェクトが間接的に指すオブジェクトが定数であるか否かを指す.
const int a = 5;    // a        ,    const。

int p = 10;

const int *a = &p;    //a       ,        ,          ,      a   p    ,        const。

 
例: