1. ホーム

ポインタの代入における const の注意:代入により、ポインタのターゲット型から 'const' 修飾子が削除される 解決策

2022-02-24 06:19:14

const と define はどちらも似たような機能を持つ記号定数を作成することができます。しかし、const は const 配列、ポインタ、const へのポインタを作成することができます。注意しなければならないのは、constは、変更する必要のないデータを読み取り専用にすることです。

#include <stdio.h>
int main (vid)
{
    double rate[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
    const double locked[5] = {0.08, 0.075, 0.0725, 0.07};
    double *pnc = rate ;

    pnc = locked; 
    pnc = &rate[3];

    return 0;
}

上記のコードではエラーが発生します。 の代入は、ポインターターゲットの型から 'const' 修飾子を破棄します。 は、その 

文字通り、assignはポインタターゲット型からconst修飾子を破棄する、という意味です。実際、プログラムを見ればわかるように、ポインタpncは通常のポインタなので、ポインタが指す値を変更したり、再代入したりすることができるのです。

しかし、このポインタが指す値はconst配列であり、const double locked[ ] 配列の中の値を変更できることになり、constが変更できない(読み取り専用)ことと明らかに矛盾しています。 


解決策としては、ポインタもconstにすることで、const配列lockedのアドレスをconstポインタpncに代入できるようにします。


要約すると 置けるconstデータ(locked[ ])のアドレスです。 

 または非固定データ(rate[ ])のアドレス 

constへのポインタの初期化(const double *pnc)、または値の代入(pnc = locked; pnc = &rate[ 3] )が正しい。

通常の(constでない)ポインタにconstデータのアドレスを代入すると、コストデータは"読み取り専用"にはなりませんが 変更可能 .