BLOGTIMES
2015/12/01

const int *p と int * const p の違い

  c 
このエントリーをはてなブックマークに追加

c言語の const キーワードを調べていて、const の微妙な位置によって意味が変わるということが分かったのでメモ。

まずは 「const int *p」

始めに試してみるのは一般的に使われている const int *p の方。gcc のメッセージの「読み取り専用位置(read-only location)」が表しているとおり、こちらはポインタの指す先が const と見なされるので、間接参照演算子を使って値を変更できなくなります。文字列などでポインタ渡ししかできないけれども、副作用は困るという場合に使うやつですね。

#include <stdio.h> void inc(const int *p){ *p += 1; p = NULL; } int main(){ int a = 0; inc(&a); printf("%d\n", a); return 0; }
$ gcc test.c test.c: 関数 ‘inc’ 内: test.c:4:2: エラー: 読み取り専用位置 ‘*p’ への代入です *p += 1; ^

マイナーな 「int * const p」の意味は・・・

const は先頭につけるものと覚えている人も多いと思いますが、実は const は int * const p と名前の直前につけることもできます。このようにすると gcc のエラーが「読み取り専用パラメータ(read-only parameter)への代入」に変化します。この場合はパラーメータが const になるということで、参照先自体は書き換えることができます。

#include <stdio.h> void inc(int * const p){ *p += 1; p = NULL; } int main(){ int a = 0; inc(&a); printf("%d\n", a); return 0; }
$ gcc test.c test.c: 関数 ‘inc’ 内: test.c:5:3: エラー: 読み取り専用パラメータ ‘p’ への代入です p = NULL; ^

仮引数に対する const はパラメーターの書き換えを禁止できるものの、このポインタを介した副作用は防ぐことができないため、プログラミング的にあまり大きな意味を持ちません。ただ、静的解析ツールの中にはパラメータへの代入を検出対象にしている場合もあるので、コードの品質向上という意味ではうまく使うと役立つかもしれません。僕は java でもパラメータには final つけたい方なので積極的に使っていこうと思います。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/8089
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン