スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ポインタ引数とconst指定

最も賢い者と最も愚かなものだけが、決して変わることがない。
孔子
今回のテーマはconst修飾子。非常に有用な修飾子ですが、意外と使われていない方も多いんではないでしょうか。

constはいろんなところに登場しますが、今回は特にポインタ変数のconst指定について書きたいと思います。

例えば、次の関数プロトタイプがあったとします。
/* position値が有効かどうか調べる */
bool
is_valid(struct position_t* p_pos);
また、この関数を使用する次のコードがあります。
{
  struct position_t pos;
  ...
  if (is_valid(&pos)) {
  ...
}
このis_valid()呼び出しでは、posのアドレスを渡しています。 ポインタ渡しなので、posの内容は書き換えられる可能性があります。 そのため、呼び出し側ではposの値がis_valid()呼び出し後も変化していないということを期待することはできません。 その後も、posを使用するのであれば、posの値をコピーする、あるいはコピーの方をis_valid()に渡す必要があります。

とはいえ、普通is_valid()のような関数はposを書き換えたりはしないでしょう。 そこで、通常は次のように、const指定をつけます。
bool
is_valid(const struct position_t* p_pos);
これで、呼び出し側は安心してポインタを渡せます。

よくコメントで、INPUTのみでしか使いませんと書いてあるのもありますが、それだけでは不十分です。コメントはあくまで補足。INPUT引数には、const指定をつけましょう。

【関連書籍】
CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 スティーブ・サミット
プログラミング言語C ANSI規格準拠 B.W.カーニハン D.M.リッチー
独習C ハーバート・シルト
Cプログラミングの落とし穴 A.コーニグ

コメント

非公開コメント

トラックバック

省略してはいけないものもある

プログラミングでは、省略できるにしても、省略してはいけないものがある。C言語の「const 修飾子」について考えてみよう。「職業としてのプログラミング」さんにも書かれているように、関数のポインタ引数に const の指定が無ければ、「この関数は、受け取った引数の示す値

本のおすすめ

4873115655

4274065979

4822236862

4274068579

4822255131

B00SIM19YS


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。