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のまま変更されないからね。」
























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

作者を応援しよう!

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

応援したユーザー

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