const int *pta = &a;と記述されて*ptaに格納されている数値データが変更できない場合を考察してみます


つづきです💖



ソーラー「次は


int a = 3;

const int *pta = &a;


が実行されたとき


*pta に格納されている値が3から変更されない場合のプログラムだね。」



#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 である変数へは割り当てることはできません


ソーラー「

int a = 3;

const int *pta = &a;


が実行されると


変数aのアドレス&aがポインタ変数ptaに代入されるため


*pta はアドレス&aのメモリにアクセスして


アドレス&aのメモリに格納されている数値データ3を


表すことになるんだね


つまり


*pta は


変数aという名前のついたメモリに格納されている数値データ3を


表すことになるんだね」


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


int a = 3;

const int *pta = &a;


が実行されたとき


constは *pta に格納されている数値でなく


変数aに格納されている数値が変更されないように働きかけています。


*pta に別の変数bのアドレス&bが代入されて


*ptaが変数bという名前の付いたメモリに


格納されている数値を表すことになったとしても


constは


a格納されている数値が変更されないように働きかけているので


*ptaにいろいろな値を代入して


変数bという名前の付いたメモリに格納されている数値を


変更することができます。



const int *pta = &a;


となっていても


*pta に格納されている数値を変更することができるというわけですの。


このプログラムの場合


int a = 3;

const int *pta = &a;


が実行されると


ポインタ変数ptaに変数aのアドレス&aが代入されているので


*ptaは変数aという名前の付いたメモリに格納されている数値を


表しており


*ptaに格納されている数値は


変数aという名前の付いたメモリに格納されている数値3


となっています。


次に


*pta =5;


が実行されると


この場合は


変数aという名前の付いたメモリに格納されている数値3


を5に変更するということになります。


constは


変数aという名前の付いたメモリに格納されている数値が3


から


変更されないようにはたらきかけているので


*pta =5;


が実行されようとすると


実行ができないよう


コンパイルエラーが出る仕組みとなっているのですの。」











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

作者を応援しよう!

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

応援したユーザー

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