constをポインタ変数宣言の前に用いて変数宣言、初期化を行っても作製されたポインタ変数に格納されているアドレスを変更することができます その2

ソーラー「おかしいな constをつけているのに


ポインタ変数ptaに格納されている値を変更することもできれば


*ptaに格納されている値を変更することもできる


ホワ~イ?




#include<stdio.h>


int main(void)

{

int a = 3;

const int *pta = &a;


//ポインタ変数ptaに変数aのアドレス&aを代入しています


/*constを変数宣言の前に使用する場合は変数宣言は初期化されていないといけません 初期化せずにコンパイルするとエラー文が表示されますが

constをポインタ変数宣言の前に使用する場合はポインタ変数宣言は初期化されている必要はありません*/


printf("%p\n", pta);

printf("%d\n", *pta);


/*ポインタ変数ptaに間接参照演算子*を用いることにより

ポインタ変数ptaに格納されているアドレス&aのメモリに格納されている数値がどうなっているのかを確かめようとしています*/


int b=5;


pta=&b;


//ポインタ変数ptaに変数bのアドレス&bを代入します


printf("%p\n", pta);

printf("%d\n", *pta);


/*ポインタ変数ptaに間接参照演算子*を用いることにより

ポインタ変数ptaに格納されているアドレス&bのメモリに格納されている数値がどうなっているのかを確かめようとしています*/


return 0;

}


(EAZY IDECの場合)


コンパイル結果

0091FF54

3

0019FF4C

5


(Visual studioの場合)


ビルド実行結果

001BFED4

3

001BFEBC

5



ソーラー「ホワ~イ


なにがオコッテイルノデス


わっかりませ~~~ん。


アレサ「ソーラーさん


int a = 3;

const int *pta = &a;


に注目してください。


もしかすると


constは int *ptaによって生成されるポインタ変数ptaでなく


*ptaに作用しているのではないですか?」


ソーラー「??


*ptaに左様??」


つまり


constは int *ptaによって生成されるポインタ変数ptaに格納されている


アドレスの値を&aのままにするという働きをするのではなく


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


3のまま一定にするという働きがあるのではないかと思いますの。」


ソーラー「激 冴えっだね。アレサ」


アレサ「ですから


そのようにconstが機能するなら


int a = 3;

const int *pta = &a;


を実行した後


*pta = 5;


を実行したなら


*pta = 5;


が実行されないようコンパイルエラーがでるのではないですか?」



ソーラー「それだ! アレサ


さっそくそのプログラムを構成してコンパイルしてみよう(*^▽^*)」



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



ソーラー「でたでた!


やったね\(^o^)/ アレサ!


constが機能して*ptaに格納されている数値が変更されないよう


コンパイルエラーが表示されたね。


つまり


const int *pta = &a;


によって


格納されているデータが変更されないようになるのは


*ptaなんだね。


だから


*ptaに


*pta = 5;


を代入しようとすると


constが機能して


*ptaに格納されている数値が3から5に変更されないよう


コンパイルエラーが出るんだ」




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

作者を応援しよう!

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

応援したユーザー

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