Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識37(constについて)

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言語