const int *pta = &a; と記述されていても *ptaに格納されている数値データを変更することができます
ソーラー「const int *pta = &a;
を実行しているのに
*pta に格納されている値が変更される場合と
*pta に格納されている値が変更されない場合の
2通りがあるんだね。
*pta に格納されている値が変更される場合のプログラムは→」
#include<stdio.h>
int main(void)
{
int a = 3;
const int *pta = &a;
printf("%p\n", pta);
printf("%d\n", *pta);
int b=5;
pta=&b;
printf("%p\n", pta);
printf("%d\n", *pta);
return 0;
}
(EAZY IDECの場合)
コンパイル結果
0091FF54
3
0019FF4C
5
(Visual studioの場合)
ビルド実行結果
001BFED4
3
001BFEBC
5
ソーラー「→
となっていて
*pta に格納されている値が変更されない場合のプログラムは→」
#include<stdio.h>
int main(void)
{
int a = 3;
const int *pta = &a;
printf("%p\n", pta);
printf("%d\n", *pta);
*pta = 5;
/*ポインタ変数ptaに格納されている数値を3から5に変更しようとしています*/
printf("%p\n", pta);
printf("%d\n", *pta);
return 0;
}
コンパイル結果
(EAZY IDECの場合)
ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/hhhhhhhh/main.c」の
「12行目」で記述エラーを発見しました。
警告
assignment of read-only location
(意味は
"読み取りのみできるメモリにデータを割り当てようとしています"
となっています
つまり
"constによってメモリに格納されている値が変更できないように
なっているメモリに別の値を格納しようとしている"
と
エラー文が表示されているわけです
solarplexussより)
ビルド実行結果
(Visual studioの場合)
エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります
エラー C3892 'pta': const である変数へは割り当てることはできません
ソーラー「→となっているわけだ。
アレサ
この2つのプログラムでは
ともに
const int *pta = &a;
が実行されているのに
なぜ
片方のプログラムでは *ptaに格納されている値を変更することができるのに
もう片方のプログラムでは *ptaに格納されている値を変更することができないのかな」
アレサ「ソーラーさん 恒例のメモリにデータが格納されているという
観点から
この2つのプログラムを
観察していけばよいのではないか と思いますの」
ソーラー「そうだね。それで解決かな。今回も😊」
アレサ「どのような考察が得られるか楽しみですの。」
ソーラー「まずは
こちらのプログラムから
どのようにデータがメモリに格納されているかをみていこう。
#include<stdio.h>
int main(void)
{
int a = 3;
const int *pta = &a;
printf("%p\n", pta);
printf("%d\n", *pta);
int b=5;
pta=&b;
printf("%p\n", pta);
printf("%d\n", *pta);
return 0;
}
(EAZY IDECの場合)
コンパイル結果
0091FF54
3
0019FF4C
5
(Visual studioの場合)
ビルド実行結果
001BFED4
3
001BFEBC
5
ソーラー「このプログラムでは
まず
int a=3;
により
変数aという名前の付いたメモリに数値データ3が格納されているね。
そして
const int *pta = &a;
により
ptaという名前の付いたメモリにアドレス&aが格納されるというわけだ。
ptaに間接参照演算子*をつけた
*ptaは
変数aという名前の付いたメモリにアクセスすることになる。
すると
*ptaは数値データ3をもつことになるんだ
printf("%p\n", pta);
printf("%d\n", *pta);
のビルド実行結果は
001BFED4
3
となっているね。」
アレサ「ここでもし
const int *pta = &a;
は *ptaに格納された数値データを変更しないようにする働きがあるとするなら
それはすなわち
変数aという名前の付いたメモリに格納されている数値データを3のまま
変更しない働きがあるということになります。
ソーラー「なるほど そうだね。」
アレサ「
次に
int b=5;
pta=&b;
が実行されると
変数bという名前の付いたメモリに数値データ5が格納されることになります
そして
ポインタ変数ptaにアドレス&bが格納されているので
*ptaは変数bという名前の付いたメモリにアクセスして
数値データ5という値を持つことになります
ソーラー「??*ptaに格納されている値は
constにより
3から変更されないようにしたんだったよね??」
アレサ「ここでおもしろいことがおこっているのですの
つまり
先程
const int *pta = &a;
は *ptaに格納された数値データを変更しないようにする働きがあるとするなら
それはすなわち
変数aという名前の付いたメモリに格納されている数値データを3のまま
変更しない働きがあるということになります。
と述べたように
const int *pta = &a;
は
変数aという名前の付いたメモリに格納されている数値データを3のまま
ので
int b=5;
pta=&b;
が実行されて
変数bという名前の付いたメモリに数値データ5が格納されることになり
そして
ポインタ変数ptaにアドレス&bが格納されているので
*ptaは変数bという名前の付いたメモリにアクセスして
数値データ5という値をあらわすことになったとしても
変数aという名前の付いたメモリに格納されている数値データは3のまま
もうすこし考察してみますと
ポインタ変数ptaにアドレス&bが格納されても
変数aという名前の付いたメモリに格納されている数値データは3のまま
つまり
const int *pta = &a;
が実行されても
作製されたポインタ変数ptaに格納されている値は
constの影響をうけず自由に変更できるということになるのですの
そして
printf("%p\n", pta);
printf("%d\n", *pta);
が実行されると
ビルド実行結果
001BFEBC(変数bのアドレス)
5(変数bに格納されている数値データ)
が表示されることなるので
*ptaに格納されている値は
3から5へ
変更されたことになりますが
変数aという名前の付いたメモリに格納されている数値データは3のまま
変更されていないのです」
ソーラー「はは そういうことなのか(*´▽`*)
int a=3;
const int *pta = &a;
と
constが int *pta の前についているのに
*pta に格納されている値が3から5に変更されている
なぜ??
とおもうのだけど
constは
*pta に格納されている数値が3から変更されないように
働いているのではなく
変数aに格納されている数値が3から変更されないように
働いているってわけだ
だから
ptaにアドレス&aが代入され
*ptaに格納される値が3となっている状態から
ptaにアドレス&bが代入され
*ptaに格納される値が5になっても全然いいわけだ
なぜなら
ptaにアドレス&bが代入されたなら
*ptaは
アドレス番号&bのメモリ
つまり
変数bという名前の付いたメモリにアクセスし
数値データ5をあらわすようになるだけで
変数aに格納されている数値は3のまま変更されないからね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます