この記事では、C言語のconstの使い方を解説します。
cosntを使うことで変数を読み取り専用にすることができます。また、ポインタ変数に使うことでアドレスを書き換え不能にしたり、アドレス先の値を書き換え不能にできます。
それでは、constの使い方を「変数」と「ポインタ変数」に分けて確認していきましょう!
スポンサーリンク
変数を読み取り専用にする
constを変数宣言時に修飾することでその変数を書き換え不能にして読み取り専用にすることができます。
書式
constは、型名の前か後ろに記述します。
const 型名 変数名 = 初期値; 型名 const 変数名 = 初期値;
プロジェクトやチームでどちらを使用するか統一しておきましょう!
サンプル
試しにconstで修飾した変数を書き換えてみましょう!
#include <stdio.h> int main(void) { // int型の定数 const int num = 1; // 書き換えてみる num = 2; }
コンパイルエラー
9: error: cannot assign to variable 'num' with const-qualified
このように、constで修飾した変数を書き換えようとするとコンパイルエラーが発生します。
ポインタ変数を修飾する
ポインタ変数を修飾する場合、constを記述する位置によって意味が異なります。
アドレス先の値を読み取り専用にする
型名の前にconstを記述するとアドレス先の値が書き換え不能となります。
#include <stdio.h> int main(void) { int num = 1; const int* p = # // アドレス先の値を書き換えてみる *p = 2; }
コンパイルエラー
9: error: read-only variable is not assignable
ポインタ変数自体を読み取り専用にする
型名の後にconstを記述するとポインタ変数自体が書き換え不能となります。
#include <stdio.h> int main(void) { int num1 = 1, num2 = 2; int* const p = &num1; // アドレスを書き換えてみる p = &num2; }
コンパイルエラー
9: error: cannot assign to variable 'p' with const-qualified
どちらにも修飾
上記の二箇所にconstを記述することでアドレス先の値も、ポインタ変数自体も書き換え不能となります。
#include <stdio.h> int main(void) { int num1 = 1, num2 = 2; const int* const p = &num1; // アドレス先の値を書き換えてみる *p = num2; // アドレスを書き換えてみる p = &num2; }
コンパイルエラー
9: error: read-only variable is not assignable 12: error: cannot assign to variable 'p' with const-qualified
関数の引数に修飾する
関数内でポインタ引数の値を書き換えられたくない場合、constで修飾することで安全に引数を扱うことができます。
// アドレス先の値を読み取り専用にする 型名 関数名(const 型名* 引数名){ } // ポインタ変数自体を読み取り専用にする 型名 関数名(型名* const 引数名){ } // 完全に読み取り専用にする 型名 関数名(const 型名* const 引数名){ }
まとめ
この記事では、C言語のconstの使い方を解説しました。
constを使うことで書き換えられたくないデータを読み取り専用にすることができ、安全性の高いコードを書くことができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


