
【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;
}
どうでしょう。