透2017/5/312019/3/27定数って使ってますか?C言語で定数というと「#define」を使って定義するイメージが強いですよね。const修飾子を使うとひとつの関数内のみで定数を扱う場合などに便利です。この記事では、constについてconstとはconstの使い方constを使う上での注意点についてなど応用的な内容についても解説していきます。まとめconstとはconstとは、変数の値を変更せず定数として宣言する際に使う修飾子です。constが付くと変数は書き換えができなくなり、読み取り専用となります。値を変更しようとするとコンパイルエラーが発生します。const修飾子は変数の型の前に記述します。const修飾子はポインタ変数に対しても使用します。ポインタ変数とは変数のアドレスを記憶する変数のことです。ポインタ変数のconst修飾子を記述する位置には以下の3種類があります。上記2つの併用それぞれで挙動が異なりますので、後でくわしく解説します。constの使い方それではconstの使い方についてサンプルコードを確認していきましょう。constは変数を修飾する場合とポインタ変数を修飾する場合と2種類ありますので、分けて確認していきます。変数を修飾する場合は、変数の型の前にconstを記述します。constを記述し初期化した変数の値を変更しようとするとコンパイルエラーが発生します。それではサンプルコードで確認していきましょう。0;}実行結果:Osakaこのサンプルコードではfloat型、int型配列、char型配列(文字列)についてconst修飾子を付けています。それぞれの変数について変更しようとするとコンパイルエラーが発生するので、コメントアウトしています。area関数内ではfloat型の第2引数にconst修飾子を付けています。関数内で第2引数の値を変更しようとするとコンパイルエラーが発生するので、コメントアウトしています。このように関数の引数にconst修飾子を付けると、関数内で値が変更されるのを防ぐことができます。main関数内の後半ではポインタ変数で文字列「Tokyo」を宣言していますが、こちらは書き換えができています。ポインタ変数を修飾する場合はconstを記述する位置により、コンパイルの可否や実行結果が変わってくるので、詳細は次節で解説します。ポインタ変数を修飾する場合ポインタ変数を修飾する場合はconst修飾子の位置により挙動が変わってきます。変数の型の前に記述する場合は、ポインタ変数自体の書き換えはできますが、ポインタ変数の要素値の書き換えができません。ポインタ変数のアスタリスクと変数名の間に記述する場合は、ポインタ変数自体の書き換えができません。ポインタ変数の要素値にアクセスしてもコンパイルエラーにはなりませんが、値の変更はできません。変数の型の前アスタリスクと変数名の間の両方に記述する場合は、ポインタ変数自体の書き換えも要素値の書き換えもできません。それではサンプルコードで確認していきましょう。0;}実行結果:OsakaTokyoこのサンプルコードのポインタ変数「pref1」では変数の型の前にconstを記述しています。ポインタ変数自体は「Osaka」に書き換えられています。ポインタ変数の0番目の要素値を書き換えようとするとコンパイルエラーが発生するので、コメントアウトしています。ポインタ変数「pref2」ではアスタリスクと変数名の間にconstを記述しています。ポインタ変数自体を書き換えようとするとコンパイルエラーが発生するので、コメントアウトしています。ポインタ変数の0番目の要素値を小文字の「t」に書き換えようとアクセスしてもコンパイルエラーにはなりませんが、値の変更はできず大文字の「T」のままです。環境によっては実行時エラーが発生することもありますので注意しましょう!ポインタ変数「pref3」では変数の型の前とアスタリスクと変数名の間の両方にconstを記述しています。ポインタ変数自体の書き換えも要素値の書き換えもできずコンパイルエラーになりますので、コメントアウトしています。constを使う上での注意点についてconstを実際に使う上で注意しなければならないことが、2つほどあります。それぞれ説明していきます。キャストによる変更const修飾はキャストにより外すこともできます。外す例をサンプルコードを使って解説しますが、外すべきかそうでないかは注意して使うようにしましょう!それではサンプルコードを確認していきましょう。0;}実行結果:helloTokyoこのサンプルコードではchar型配列(文字列)のconstを外す方法を説明します。char型配列(文字列)を定数ポインタへキャストしています。定数ポインタをキャストしてconstを外しています。通常のchar型のポインタの0番目の要素値を小文字の「h」に書き換えています。文字列を表示出力すると頭文字が小文字に書き換えられ出力表示されています。ポインタ型文字列のconstを外そうともしていますが、コンパイルは出来ますが同様に要素値を書き換える際に実行時エラーが発生します。ご注意ください!名前の大文字定義による変更const修飾子を付けると読み込み専用で定数扱いとなります。定数扱いの場合は宣言する際に大文字で記述するのが慣例となっていますが、C言語の場合はdefineマクロで定数を宣言する場合に大文字表記で行います。100const修飾子を付けて仮に大文字で宣言すると、defineマクロでの宣言と名前の衝突が発生し値が書き換えられる危険性があるので、const修飾子を付けて宣言する場合は小文字で命名します。100;注意しましょう!まとめここでは、constの使い方について説明しました。ひとつの関数内のみで定数を扱う場合に使用すると便利です。ポインタ変数に使う場合の記述する位置やキャストによる外れ、define定義との名前の衝突など注意すべき点もありますので使いこなすことができるように、この記事を何度も参考にして下さいね!TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。お問合せはこちらでも受け付けています。