自作関数の引数となっているポインタ変数宣言にconstをつけてみる その2
ソーラー「さてさて先ほどのプログラムでは
自作関数の引数がconst int *ptxになっていたね。」
#include <stdio.h>
void function(const int *ptx) {
//🌞自作関数の引数がconst int *ptxになっています。
int b=2;
ptx=&b;
printf("%d\n", *ptx);
return;
}
int main(void) {
int a=1;
function(&a);
//🌞自作関数の引数const int *ptxに変数aのアドレスaを代入しました
return 0;
}
(EAZY IDECの場合)
コンパイル結果
2
(Visual studioの場合)
ビルド実行結果
2
ソーラー「そして
main関数内で
function(&a);
が実行されると
const int *ptxにアドレス&aが代入された状態
const int *ptx=&a;
となります。
このとき
constによって変更されないことになるのは
*ptxに格納されている数値ではなく
アドレス&aの番号の付いたメモリに格納されている数値
つまり
変数aという名前の付いたメモリに格納されている数値でした。
そう
constによって変更されないことになるのは
変数aという名前の付いたメモリに格納されている数値なのです。
ですので
自作関数の定義を
void function(const int *ptx) {
int b=2;
ptx=&b;
printf("%d\n", *ptx);
return;
}
を
void function(const int *ptx) {
*ptx=2;
printf("%d\n", *ptx);
return;
}
と
変更すると
コンパイルエラーが表示されます。
solarplexuss「なんでぇ??」
ソーラー「実際に自作関数の定義を変更して
プログラムを実行してみましょう。
#include <stdio.h>
void function(const int *ptx) {
*ptx=2;
printf("%d\n", *ptx);
return;
}
int main(void) {
int a=1;
function(&a);
//🌞自作関数の引数const int *ptxに変数aのアドレスaを代入しました
return 0;
}
(EAZY IDECの場合)
コンパイル結果
ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/hhhhhhhh/main.c」の
「5行目」で記述エラーを発見しました。
警告
assignment of read-only location
(Visual studioの場合)
ビルド実行結果
エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります
エラー C3892 'ptx': const である変数へは割り当てることはできません
solarplexuss「コンパイルエラーがでてきた?」
ソーラー「main関数内で
int a=1;
function(&a);
が実行されると
const int *ptxにアドレス&aが代入された状態
const int *ptx=&a;
となります。
このとき
constにより
変数aに格納された値は1から変更されないようになっています。
ここまではいいんですが
自作関数の定義が
void function(const int *ptx) {
*ptx=2;
printf("%d\n", *ptx);
return;
}
となっていることに注目してほしいな。」
solarplexuss「にゃお~?」
ソーラー「
注目ポイントは
*ptx=2;
だね。
function(&a);
が実行されることにより
const int *ptx=&a;
が実行されると
先のエピソードでも考察したように
変数aに格納された値は1から変更されないようになります。
const int *ptx=&a;
が実行されると
ポインタ変数ptxが生成され
ポインタ変数ptxには変数aのアドレス&aが代入されているので
*ptxは変数aのメモリにアクセスして
変数aのメモリに格納されている数値を変更することが
できるようになります。
もちろん
このときの
*ptxは変数aのメモリに格納されている数値1をあらわしてもいます。
この状態で
*ptx=2;
を実行するということは
変数aのメモリに格納されている数値を
1から
2に変更することになるわけです。
もちろん
constにより
変数aに格納されている値は
1のまま変更されないことになっているので
*ptx=2;
を実行しようとすると
このプログラムのように
コンパイルエラーがでるというわけなのさ(^_-)-☆」
solarplexuss「なぁにぃ~」
ソーラー「だから
constにより
変数aに格納されている値は変更されないように設定されているので
変数aに格納されている値にアクセスして格納されている数値を
変更するような
命令文を記述しようとすると
コンパイルエラーが表示されてしまうんだね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます