FromNandの日記

自分的備忘録

【C言語】constについて気をつけることとか

const指定子がめんどくさいのでまとめておく 

参考 : const修飾子について - Qiita

 

例えば次のコード

const int *i;

i is pointer to read-only int.

int const *i;

i is pointer to read-only int.

int * const i;

i is read-only pointer to int.

上の二つはポインタが指す先を書き換えることができないが、

三つめはポインタ自体を書き換えることができない。

 

一瞬配列自体にconstを付けられるかなんて考えてしまったが、配列はそもそもラベルでしかなく、保存領域を持っていないのでconstなんて適用することはできない。

もちろん、配列の内容に対してはconstを適用することはできるが...

 

またconstのポインタのポインタなんかをとったりするときには、一番端のポインタ変数だけをconstで保護してもそれに至るまでのポインタを書き換えられたりしたら意味がないことが多いのですべてconst修飾するといい。

const int *const *const *const p;

 

constな領域を指すポインタはただのポインタに代入することはできない。

これは当然で、constな領域を代入後のポインタで書き換えることができるようになってしまうから。

 

これと同様の原理で、もしconstになるべきライブラリの引数にconstがついていなかった場合、それを呼び出す実引数はconstを取りやめざるを得なくなる。

また、constつきの引数を取る関数の中でさらにその引数を他の関数に渡したりすることがあると思うが、この場合、中で呼び出す関数もconst付きのプロトタイプ宣言をしておかねばならない。

 

 

ローカル変数につけたconstは文法上で書き込みは不可能になるが、ポインタをキャストしたりして無理やり書き込んだ場合は実際には書き込めてしまう。

これはローカル変数がスタックに置かれるためだ。

一方でグローバル変数につけたconstは書き込み不可領域に置かれることが多いようだ。

 

 

これぐらいかなぁ、追記するかも。