見出し画像

【C言語】ポインタ変数に「const」を付けよう!

C言語にはポインタ変数というものがあります。

ポインタについてはこちらもどうぞ。

char x = 13;    // ←①
char* px = &x;  // ←②

と書くと、次のようにメモリを確保します。

もう一つ、「*px」はここを指します。

この絵からもわかる通り「px」というシンボルから2つのデータをアクセスすることができます。

1つは「0x075BCD16」。
そしてもう1つが「13」です。

このため、ポインタ変数にはそれぞれに「const」を指定することができます。

例えば、こんな風に「const」をつけた場合、

const char* px = &x;

次の「13」が更新できなくなります。

const char* px = &x;
*px = 15;  // これはダメ
px = &y;   // これは大丈夫

では、次の絵にある「0x075BCD16」を「const」にするためにはどうすればいいのでしょうか。

その場合はこのように書きます。

char*const px = &x;
*px = 15;  // これは大丈夫
px = &y;   // これはだめ

両方ともに「const」にする場合は次のように書きます。

const char*const px = &x;
*px = 15;  // これはダメ
px = &y;   // これもダメ

ちょっと、まあ、「const」だらけなんですけども、仕方ないですね。


[2023/4/16 追記]
遊月さんの次のコメントを受けて考えてみました。

「constは直前の型に作用する」

ダブルポインタになると更にややこしい。
「直前の型に作用する」と考えるとすっきりするだろうか。
ということで、書いてみた。

int main()
{
    char x;
    char * px = &x;
    char const** px1 = &px;
    char *const* px2 = &px;
    char **const px3 = &px;

      px1 = 0;    // char const** px1
     *px1 = 0;    // char const** px1
    **px1 = 0;    // char const** px1 --- NG

      px2 = 0;    // char *const* px2
     *px2 = 0;    // char *const* px2 --- NG
    **px2 = 0;    // char *const* px2

      px3 = 0;    // char **const px3 --- NG
     *px3 = 0;    // char **const px3
    **px3 = 0;    // char **const px3

    return 0;
}

どうでしょう。

この記事が気に入ったらサポートをしてみませんか?