天国にいけるC言語入門 ヘキサ構造体 ver2.2126
変数宣言int a;にconstが用いられてconst int a; となった場合 プログラムのどの範囲まで変数aに格納された数値は1から変更されないのでしょうか
変数宣言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に変更されているのが
分かると思うな」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます