const (修飾子)
この記事では、C言語におけるconstの内容と使用方法について記載する。
1. 目的
・constの意味ついて知る。
・const使い方を知る。
目次
2. constとは
・変数やポインタ、関数の戻り値に対して使用できる修飾子の一つ。
・プログラム内でその変数やポインタを変更できなくする。
(固定する。)
・constを使用することにより、プログラムの品質や安全性を向上させることが出来る。
・C言語では、書き換えできない変数扱いの為、配列の要素などで、定数としては使えない。
3. constの使い方
・使用方法:
(1) const で変数を定数化(書き換え出来ない変数にする)
const 型 変数 = 数値;
例:
const int age = 40;
age = 31; // エラー: const変数は変更できない。
(2) constでポインタが指すデータの変更を出来なくする。
const 型 *ポインタ = 変数;
例:
int value1 = 100; int value2 = 1000; const int *ptr2 = &value1; ///< ポインタからデータ(値)は変更できない。 // *ptr2 = 200; ///< エラー:constポインタを介してデータ変更できない。 ptr2 = &value2; ///< ポインタの指す先は変更可能。
(3) constでポインタの指す先を変更できなくする。
型 * const ポインタ = 変数;
例:
int value = 10; int value2 = 1000; ///ポインタ宣言 int * const ptr1 = &value; ///< ポインタの指すアドレスは変更できない。 *ptr1 = 20; ///< constポインタを介してデータ変更可能 // ptr1 = &value2; ///< エラー:ポインタの指す先は変更できない。
(4) 関数の呼び出し元から引数の変更を受け付けなくする。
また、その関数が引数の値を変更しないことを約束する。
基本的にC言語では、引数をそのまま渡した場合、呼び出し元の値は変更しない。
ポインタを引数にした場合、呼び出し元の値も変更になるので、
その場合は、constを使用することにより、意図しない変更を防ぐことが出来る。
型 関数名(const 引数){ }
例:
void getValue(const int a){ // 何らかの計算など }
3. constを使用したプログラム
(1 )const で変数を定数化(書き換え出来ない変数にする)
#include <stdio.h> int main(void){ // Your code here! const int a = 10; // a = 31; // エラー: const変数は変更できない。
printf("a=%d\n",a); ///< aの値を表示 }
実行結果:https://paiza.io/projects/CLW1sfIBgbxvV-9K6hzk7A
・コメントアウトした部分を外すと、下記エラーになる。
→cannot assign to variable 'a' with const-qualified type 'const int'
(2) constでポインタが指すデータの変更を出来なくする。
(3) constでポインタの指す先を変更できなくする。
#include <stdio.h> int main(void){ // Your code here! int value = 10; int value2 = 100; int value3 = 1000; ///ポインタ宣言 int * const ptr1 = &value; ///< ポインタの指すアドレスは変更できない。 int const *ptr2 = &value2; ///< ポインタからデータ(値)は変更できない。 printf("*ptr1_1=%d\n",*ptr1); ///< ptrを表示 *ptr1 = 20; ///< constポインタを介してデータ変更可能 printf("*ptr1_2=%d\n",*ptr1); ///< ptrを表示 // *ptr2 = 200; ///< エラー⓵:constポインタを介してデータ変更できない。 // ptr1 = &value3; ///< エラー⓶:ポインタの指す先は変更できない。 printf("*ptr2_1=%d\n",*ptr2); ///< ptrを表示 ptr2 = &value3; ///< ポインタの指す先は変更可能。 printf("*ptr2_2=%d\n",*ptr2); ///< ptrを表示 }
実行結果:https://paiza.io/projects/SLvCfsF6uOtHk-J6LV9caA?language=c
・コメントアウトした部分を外すと、下記エラーになる。
→①の場合:read-only variable is not assignable
→②の場合:cannot assign to variable 'ptr1' with const-qualified type 'int *const'
※ポインタによる、意図しない変更を防ぐ場合などで使用される。
(4) 関数宣言時にconstすることで、その関数が呼び出し元から変更を受け付けなくする。
#include <stdio.h> void setValue(const int *value){ // *value = 2; ///< エラー:constでポインタのデータを変更できない。 printf("value = %d\n",*value); } int main(void){ // Your code here! int value = 4; ///< setValue関数に引き渡す変数の宣言 setValue(&value); ///< setValue関数実行 }
実行結果:https://paiza.io/projects/1ujZB-a8sQ8osCPC3X718g?language=c
・コメントアウトした部分を外すと、下記エラーになる。
→read-only variable is not assignable
※ポインタによる、意図しない変更を防ぐ場合などで使用される。
また、これをすることにより、ポインタによるデータの変更がないと明示できる。
参考記事:
・const の活用 | Programming Place Plus C++編【言語解説】 第15章
・【C言語】constの使い方・メリットを解説 | だえうホームページ
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary