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

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

4週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

5か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago