C言語

【C言語】constを使って変数やポインタ変数を読み取り専用にする方法

この記事では、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 = &num;

    // アドレス先の値を書き換えてみる
    *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を使うことで書き換えられたくないデータを読み取り専用にすることができ、安全性の高いコードを書くことができます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』