2

ポインターと const を扱う場合、それらを宣言する方法が 3 つあります。

1)

int nValue = 5;
int *const pnPtr = &nValue;

2)

int nValue = 5;
const int *pnPtr = &nValue;

3)

const int 5;
const int *const pnPtr = &nValue;

例 1 は、「非 const への const ポインター」と呼ばれます。アドレスは変更できませんが、値は変更できます。例 1 の nValue は非 const int であるため、次のようなことができます。

int nValue = 5;
int const *pnPtr = &nValue;

*pnPtr = 6; 

ただし、例 1 では次のことはできません。

int nValue = 5;
int nValue2 = 6;
int const *pnPtr = &nValue;
pnPtr = &nValue2; 

例 2 は「const へのポインタ」と呼ばれます。つまり、アドレスは変更できますが、値は変更できません。次のことができます。

int nValue = 5;
int nValue2 = 6;

const int *pnPtr = &nValue;
pnPtr = &nValue2;

ただし、例 2 では次のことはできません。

int nValue = 5;
int nValue2 = 6;

const int *pnPtr = &nValue;
*pnPtr = nValue2;

例 3 は、「const への Const ポインター」です。これは、アドレスも値も変更できないことを意味します。

const int nValue;
const int *const pnPtr = &nValue;  

私の質問は、2 番目の例に関連しています。nValue が const でない場合、2 番目の例が「const へのポインター」と呼ばれるのはなぜですか。通常の int 宣言です。また、2 番目の例で、別のアドレスを割り当てたときに、その別のアドレスが異なる値を持っている場合、そのアドレスを参照して別の値を返すことはできないのでしょうか? それは目的全体を無効にしないでしょうか?

4

2 に答える 2

5

2 番目の例のconstは に適用されintます。つまり、 への非constポインタがありconst intます。C および C++ の型は右から左に読み取られるため、constalways を右に配置するのが実際には最も簡単です。また、一貫して配置できる唯一の場所でもあります。

int i(0);
int      *       p0(&i); // non-const pointer to non-const int
int const*       p1(&i); // non-const pointer to const int
int      * const p2(&i); // const pointer to non-const int
int const* const p3(&i); // const pointer to const int

つまりconst、ポインター ( p0andは変更できますが、p1変更できない) と、ポインターが指しているエンティティ ( andは変更できますが、変更できない) に適用できます。2 行目と 4 行目では、とを入れ替えることができますが、そうしないことをお勧めします。p2p3*p0*p2*p1*p3intconst

于 2013-11-14T01:43:42.280 に答える