この記事では、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を使うことで書き換えられたくないデータを読み取り専用にすることができます。書き換えられたくないデータはconstで修飾し、安全性の高いコードを作成しましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ