C言語講座 - const変数と定数とマクロ

プログラム中で、絶対に変えない数値が出てくると思います。 そのときは「const変数」にしてしまうと、うっかり書き換えても警告やエラーがでるので安心です。


const double pi = 3.14159265358979323846264338; /* const変数 */
const double *p1 = π /* constポインタ */

double d = 1.02;
double *const p2 = &d; /* アドレス不変ポインタ */

/*	これはエラーがでる処理です!
pi  = 3.1416;  constの中身は不変
*p1 = d;       const * の指す変数の中身は不変
p2  = π     * const のアドレスは不変
*/

p1 = &d; /* 収納するアドレスは変えられる */
*p2 = pi; /* 収納している変数(d)のデータは変えられる */

printf("p1 : %0.20f\nd : %0.20f\n",pi,d);

「const変数」にするには、変数を宣言するときに頭に「const」をつければいいだけです。 これでこの変数を変えようとしたときにエラーなどが出ます。そのため必ず初期化します。 そしてconst変数を格納するポインタを「constポインタ」といい、「const 型 *名前」として作ります。 このポインタは const変数を格納しているので、中身を変えられなくなります。

また、「アドレス不変ポインタ」も作ることが出来ます。これを作るには「型 *const 名前」とします。 さっきのポインタとは違い、こっちは「アドレス」が不変になる為、初期化時のアドレスを一生持ち続けるわけです。

const変数の利点は不変であるということです。 constポインタには、関数に引数として渡した時に中身が変わっていない保証となる利点もあります。 つまりうっかり関数内で変更してはいけないポインタを変更してしまったりするバグが防げるわけです。


#define LEN 256
#define MAX (LEN + 4)

int i = MAX * LEN; /* (LEN + 4) * 256 と同じ */

また、定数を作るには実は #define を使う方法の方が一般的です…。使い方は「#define 名前 中身」で、 #defineディレクティブは、「名前」の部分を「中身」に置き換える役割を持っています。

#defineディレクティブで一度定義してしまえば、変数ではないのでどこでも使えます。 例えば、変数ではできない配列の項目数などにも使うことが出来ます。

また #defineディレクティブは、「マクロ」という関数の簡単なもののようなものを作ることも出来ます。 作り方は定数の場合と全く同じです。 しかしマクロでのバグは有名で、上の例の MAX の括弧を取ってしまっただけで、iの値は予期していなかったものになります。 つまり、「(256 + 4) * 256 = 66560」から「256 + 4 * 256 = 1280」に変わってしまうので、優先順位により結果が変わってしまうわけです。 マクロの括弧だけは忘れないように注意しましょう。

Download 今回のソースDownload


★TOP★

Copyright(C) へぽぽ