C言語 const修飾子の使い方

この記事のポイント

この記事では、const修飾子について基礎から応用まで詳しく説明していきます。プログラミング初心者の方でも理解できるよう、具体的なコード例を交えながら解説します。

  • const修飾子による変数の読み取り専用化機能
  • ポインタとconst修飾子の組み合わせによるメモリ保護手法
  • 関数パラメータでのconst修飾子活用による安全性向上策

以下の内容を順序立てて学ぶことで、const修飾子を効果的に使いこなせるようになります。

目次

const修飾子とは?

const修飾子は、変数や配列、ポインタなどを読み取り専用にするための機能です。constを付けた変数は、初期化の後に値を変更できなくなります。これにより、プログラムの実行中に意図しない値の変更を防ぎ、バグの発生を抑制できます。

const修飾子は「定数」を意味する英単語constantから来ており、一度設定された値が変わらないことを保証します。プログラムの安全性を高めるとともに、コードの意図を明確に示す役割も果たします。コンパイラは、const修飾された変数への代入を検出するとエラーを出力するため、開発段階で問題を発見できます。

【関連】
C言語をもっと詳しく学ぶならpaizaラーニング

基本構文

C言語でconst修飾子を使用する基本的な構文を見てみましょう。最もシンプルな形は、変数の宣言時にconstキーワードを付ける方法です。
この例では、DOG_AGEとCAT_WEIGHTという2つのconst変数を宣言しています。これらの変数は初期化後に値を変更することはできません。もし変更しようとすると、コンパイル時にエラーが発生します。const修飾子は、データ型の前に記述するのが一般的な書き方となっています。

#include <stdio.h> int main() { const int DOG_AGE = 5; const double CAT_WEIGHT = 3.2; printf("犬の年齢: %d歳\n", DOG_AGE); printf("猫の体重: %.1fkg\n", CAT_WEIGHT); return 0; }

出力結果

犬の年齢: 5歳
猫の体重: 3.2kg

実用例

ここからは、const修飾子をさまざまな場面で活用する具体的なコード例を紹介します。実際のプログラム開発で頻繁に使用されるパターンを中心に、わかりやすいサンプルコードとともに解説していきます。各例では、const修飾子の使い方とその効果を理解できるよう、出力結果も併せて確認できます。

定数の宣言例

数学定数や設定値など、プログラム中で変更されるべきでない値をconst修飾子で保護する例です。

#include <stdio.h> int main() { const double PI = 3.14159; const int RABBIT_COUNT = 10; double radius = 5.0; double area = PI * radius * radius; printf("半径%.1fの円の面積: %.2f\n", radius, area); printf("ウサギの数: %d匹\n", RABBIT_COUNT); return 0; }

出力結果

半径5.0の円の面積: 78.54
ウサギの数: 10匹

const配列の使用例

配列全体を読み取り専用にすることで、データの整合性を保護できます。

#include <stdio.h> int main() { const int BIRD_COUNTS[] = {3, 7, 2, 9, 1}; const int SIZE = 5; printf("各地域の鳥の数:\n"); for(int i = 0; i < SIZE; i++) { printf("地域%d: %d羽\n", i+1, BIRD_COUNTS[i]); } return 0; }

出力結果

各地域の鳥の数:
地域1: 3羽
地域2: 7羽
地域3: 2羽
地域4: 9羽
地域5: 1羽

関数パラメータでのconst

関数が受け取る引数を変更しないことを明示し、安全性を向上させる使い方です。

#include <stdio.h> void print_animal_info(const char* NAME, const int AGE) { printf("動物名: %s\n", NAME); printf("年齢: %d歳\n", AGE); // name[0] = 'X'; // エラー: const修飾のため変更不可 } int main() { print_animal_info("ライオン", 8); return 0; }

出力結果

動物名: ライオン
年齢: 8歳

ポインタとconstの組み合わせ

ポインタが指すデータや、ポインタ自体を保護する高度な使用方法を示します。

#include <stdio.h> int main() { int tiger_weight = 200; int elephant_weight = 3000; const int* PTR1 = &tiger_weight; // 指す先の値が変更不可 int* const PTR2 = &elephant_weight; // ポインタ自体が変更不可 printf("トラの体重: %dkg\n", *PTR1); printf("ゾウの体重: %dkg\n", *PTR2); return 0; }

出力結果

トラの体重: 200kg
ゾウの体重: 3000kg

構造体メンバーのconst

構造体の特定のメンバーをconst修飾して、一部のデータを保護する例です。

#include <stdio.h> typedef struct { const int SPECIES_ID; char name[20]; int age; } Animal; int main() { Animal panda = {1001, "パンダ", 5}; printf("種別ID: %d\n", panda.SPECIES_ID); printf("名前: %s\n", panda.name); printf("年齢: %d歳\n", panda.age); return 0; }

出力結果

種別ID: 1001
名前: パンダ
年齢: 5歳

グローバルconst変数

プログラム全体で使用される定数をグローバルスコープで定義する方法です。

#include <stdio.h> const int MAX_SHEEP = 100; const char FARM_NAME[] = "みどり牧場"; void show_farm_info() { printf("牧場名: %s\n", FARM_NAME); printf("最大飼育数: %d頭\n", MAX_SHEEP); } int main() { show_farm_info(); return 0; }

出力結果

牧場名: みどり牧場
最大飼育数: 100頭

constポインタの配列

複数のconst文字列を効率的に管理する実用的な例を示します。

#include <stdio.h> int main() { const char* const animals[] = { "イヌ", "ネコ", "ウマ", "ウシ" }; const int count = 4; printf("飼育動物一覧:\n"); for(int i = 0; i < count; i++) { printf("%d. %s\n", i+1, animals[i]); } return 0; }

出力結果

飼育動物一覧:
1. イヌ
2. ネコ
3. ウマ
4. ウシ

まとめ

const修飾子は、プログラムの安全性と可読性を大幅に向上させる機能です。変数、配列、ポインタ、関数パラメータなど、さまざまな場面で活用できるため、適切な使い方を覚えることが大切です。

constを使用することで、意図しないデータの変更を防ぎ、バグの発生を抑制できます。また、コードを読む人に対して、その変数やデータが変更されないことを明確に示す効果もあります。

constの活躍する場面

  • 数学定数や設定値の定義で値の保護を実現
  • 関数パラメータでの引数変更防止による安全性確保
  • 配列やポインタでのデータ整合性維持

重要なポイント

  • const修飾された変数は初期化後の値変更が不可能
  • ポインタとの組み合わせで柔軟なメモリ保護が実現
  • コンパイル時エラー検出によるバグの早期発見が可能

const修飾子を正しく理解し活用することで、より堅牢で保守しやすいC言語プログラムを作成できるようになります。初心者の方も、まずは基本的な使い方から始めて、徐々に高度な活用方法にも挑戦してみてください。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. C言語のリファレンス記事一覧
  4. C言語 const修飾子の使い方