Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語入門】const変数の値を変更する方法を解説!ポインタを使ったテクニック

C言語やC++では、constキーワードを使って定数(constant)変数を定義できます。const変数は一度初期化すると、その後は値を変更できないのが基本ルールです。しかし、この記事ではconst変数の値を変更するテクニックについて詳しく解説します。

まず、const変数の値を直接変更しようとするとどうなるか見てみましょう。結論から言うと、コンパイル時にエラーが発生します。以下のコード例で確認してみましょう。

例1:const変数への直接代入

#include <stdio.h>
main() {
    const int x = 10; // 定数int型を定義
    printf("x = %d\n", x);
    x = 15; // 定数の値を更新しようとする
    printf("x = %d\n", x);
}

出力結果

[Error] assignment of read-only variable 'x'

上記のコードでは、「読み取り専用変数 'x' への代入」というコンパイルエラーが発生します。これはconst修飾子によって変数xが読み取り専用(read-only)として扱われているためです。

それでは、どのようにすればconst変数xの値を変更できるのでしょうか。

ポインタを使ってconst変数の値を変更する方法

const変数の値を変更するには、ポインタを使用します。具体的には、変数xのアドレスを指すポインタを作成し、そのポインタを通じて値を更新します。この方法なら、コンパイルエラーを発生させることなく値を書き換えることができます。

例2:ポインタ経由での値の変更

#include <stdio.h>
main() {
    const int x = 10; // 定数int型を定義
    int *ptr;
    printf("x = %d\n", x);
    ptr = &x; // ptrが変数xを指す
    *ptr = 15; // ポインタ経由で値を更新
    printf("x = %d\n", x);
}

出力結果

x = 10
x = 15

このように、ポインタを介することでconst変数の値を10から15へと書き換えることに成功しました。コンパイラは直接代入のみをチェックするため、ポインタ経由の操作ではエラーが検出されないのです。

注意点:未定義動作のリスク

このテクニックは技術的には動作しますが、実務での使用には注意が必要です。constオブジェクトの値をポインタ経由で変更する行為は、C言語では未定義動作(undefined behavior)とみなされる可能性があります。特にC++では明確に未定義動作となるため、プログラムが予期しない挙動を示す危険性があります。

実際の開発では、const修飾子の意図を尊重し、このような方法に依存しない安全なコード設計を心がけましょう。あくまで、ポインタの仕組みやメモリの挙動を学ぶための教材として理解しておくことをおすすめします。

  1. PHPでグローバル変数を宣言する方法をわかりやすく解説

    グローバル変数とはグローバル変数とは、プログラム内のどこからでもアクセスできる変数のことです。しかし、PHPでは関数の中からグローバル変数を変更したい場合、その関数内で明示的に「これはグローバル変数である」と宣言しなければなりません。この宣言は、変数の前に global キーワードを置くだけで簡単に行えます。例1:globalキーワードで変数を書き換える以下のコードでは、PHPでグローバル変数を宣言し、関数内から値を変更する方法を確認できます。<?php    $val = 1;    function di

  2. C#で変数を定義する方法とは?基本構文と各型の宣言例をわかりやすく解説

    C#における変数の「型」とは C#のすべての変数には、それぞれ特定の「型」が割り当てられています。この型によって、次の3つの要素が決まります。 変数が使用するメモリのサイズとレイアウト そのメモリに格納できる値の範囲 変数に対して実行できる操作(演算)の種類 変数定義の基本構文 C#で変数を定義する際は、以下の構文を使用します。 <data_type> <variable_list>; つまり、「データ型」に続けて「変数名」を記述し、行末にセミコロン(;)を付けます。カンマで区切ることで、複数の変数を一度に宣言することも可能です。 変数定義の具体例 int型の変数を