変数宣言int a;にconstが用いられてconst int a; となった場合 プログラムのどの範囲まで変数aに格納された数値は1から変更されないのでしょうか

ソーラー「変数宣言,初期化


int a=1;


constを使用して


const int a=1;


と表記した場合


変数aに格納された値は1のまま


変更することはできなくなります


#include <stdio.h>


int main(void) {

const int a = 1;


a = 3;


return 0;

}


(EAZY IDECの場合)


コンパイル結果


ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/hhhhhhhh/main.c」の

「7行目」で記述エラーを発見しました。

警告

assignment of read-only location



(Visual studioの場合)


ビルド実行結果


エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります

エラー C3892 'a': const である変数へは割り当てることはできません


ソーラー「このプログラムのように


const int a = 1;


により


変数aに格納されている数値1を


a = 3;


により


3に


変更しようとすると


コンパイルエラーが出ます。


プログラムを実行できません。」


ソーラー「さて、ここで


const int a = 1;


が実行された場合


いったい


プログラムのどの範囲まで


constによって


変数aに格納された数値は1から変更されないのでしょうか?


基本的に


const int a = 1;


の有効範囲は


変数宣言、初期化

const int a = 1;

が実行された


関数のブロック{}内となっているんだ。


今のプログラムなら


#include <stdio.h>


int main(void) {

const int a = 1;👉


a = 3;


return 0;

👈}



の👉👈の範囲内で


const int a = 1;


は有効になる。


つまり


👉👈の範囲内で


変数aに格納されている数値は1から変更されなくなるんだ。」



次に自作関数の引数となっている変数宣言


int x


にconstをつけて


const int xとした場合の


const int xの有効範囲について


みていこうかな?


#include <stdio.h>


void function(const int x) {


printf("%d\n", x);


return;

}


int main(void) {


function(1);

//自作関数の引数const int xに1を代入しました


return 0;

}


(EAZY IDECの場合)

コンパイル結果

1



(Visual studioの場合)

ビルド実行結果

1



ソーラー「function(1);


により


自作関数の引数となっている


const int x


const int x=1;


と1を代入すると


変数xに格納されている数値は1から変更されなくなります


そのとき


変数xに格納されている数値が1から変更されなくなる範囲は


自作関数の定義の


void function(const int x) {👉


printf("%d\n", x);


return;

👈}


👉👈内の範囲となります。



ですので


変数xに格納されている値を


x=2;


に変更するような


命令文が


void function(const int x) {👉

     x=2;

printf("%d\n", x);


return;

👈}


👉👈内の範囲に記述されていると


function(1);


は実行されず


コンパイルエラーが表示されることになります。



次は


自作関数の引数となっているポインタ変数宣言


int *ptx


にconstをつけて


const int *ptxとした場合の


const int *ptxの有効範囲について


みていこうかな?」


#include <stdio.h>


void function(const int *ptx) {


printf("%d\n", *ptx);


return;

}


int main(void) {


int a = 1;


function(&a);

//自作関数の引数const int *ptxに変数aのアドレスaを代入しました

a = 3;

printf("%d\n", a);

return 0;

}


(EAZY IDECの場合)

コンパイル結果

1

3


(Visual studioの場合)

ビルド実行結果

1

3


アレサ「ソーラーさん


変数aに格納されている数値が1から3に


変更されています」


ソーラー「いいところに・・・


そう みんな 気になるかな😊



function(&a);


により


自作関数の引数となっている


const int *ptx


const int *ptx=&a;


と&aを代入すると


前のエピソードでも見てきたように


変数aに格納されている数値は1から変更されなくなります


そのとき


変数aに格納されている数値が1から変更されなくなる範囲は


自作関数の定義の


void function(const int *ptx) {👉


printf("%d\n", *ptx);


return;

👈}


👉👈内の範囲となります。


ですので


main関数内では


変数aに格納されている値を自由に変更することができます。


main関数内では

👇

_____________________________

int a = 1;


function(&a);

//自作関数の引数const int *ptxに変数aのアドレスaを代入しました


a = 3;

printf("%d\n", a);

_____________________________

の4つの命令文が実行されています


function(&a);


が実行されている間は


変数aに格納されている値は1から変更されませんが


const int *ptx=&a;


の有効範囲


つまり


変数aに格納されている値が1から変更されない範囲は


自作関数functionのブロック{}内となっているので


main関数内では


変数aに格納されている値をどんどん変更することができます。


このプログラムでも

👇          」


#include <stdio.h>


void function(const int *ptx) {


printf("%d\n", *ptx);


return;

}


int main(void) {


int a = 1;


function(&a);

//自作関数の引数const int *ptxに変数aのアドレスaを代入しました

a = 3;

printf("%d\n", a);

return 0;

}


(EAZY IDECの場合)

コンパイル結果

1

3


(Visual studioの場合)

ビルド実行結果

1

3


ソーラー「自作関数の引数が


const int *ptx


となっていて


const int *ptx=&a;


により


自作関数function内では


変数aに格納されている数値が1から変更されなくなったとしても



main関数内では


変数aに格納されている数値が1から3に変更されているのが


分かると思うな」




















  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます