auの日記

プログラミング初心者の日記。(auはハンドルネームです)

C言語のconstとは

auです。
前回は修飾子とはどんなものかを書きました。
program-shoshinsya.hatenablog.com
データ型にくっつけて、効果を追加するというイメージです。
その中のconstについて調べてみました。

constとは

constとは、変数の値を読み出し専用として宣言したい場合に使う修飾子のことです。(定数ではない)
constを付けて宣言することで、その値は読み出し専用となるため、書き換えることができなくなります。もし、書き換えようとするプログラムをコンパイルした際にはエラーがでます。
また、ポインタ変数もconstを付けて宣言することができ、その場合はアドレスを修飾します。

constの宣言の仕方

int型をconstで修飾した形で宣言します。

 const int i = 0;

これで0を読み込むことしかできなくなりました。
変更を試みてみます。

#include <stdio.h>

int main(void) {
    const int i = 0;
    i = 3;
    return 0;
}

// 実行結果
const.c: In function ‘main’:
const.c:5:7: error: assignment of read-only variable ‘i’
     i = 3;

"read-only"といわれているので読み込み専用と分かると思います。

次に、ポインタ変数に代入した場合にどうなるかを確認したいと思います。

#include <stdio.h>

int main(void) {
    const int i = 0;
    int *pi = i;
    pi = 3;
    printf("%d\n", pi);
    return 0;
}

// 実行結果
3

なんと書き換えることができました!
しかし、コンパイル時には

const.c: In function ‘main’:
const.c:5:15: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     int *pi = i;
               ^
const.c:6:8: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
     pi = 3;
        ^
const.c:7:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("%d\n", pi);
            ^

と、警告されます。
警告されてますが、変更できるのはうーんと思いますが...