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

ソーラー「


constを変数宣言の前に用いて変数宣言、初期化を行うと作製された変数に格納されているデータを変更することはできません



というのなら


constをポインタ変数宣言の前に用いてポインタ変数宣言、初期化を行うと作製されたポインタ変数に格納されているデータを変更することはできません


となるのかな」


アレサ「ソーラーさん タイ焼きがうまく焼きあがりました」


ソーラー「え? いつのまに・・・


どれどれ・・・」


ソーラー「こ、これは・・・


この仕上がりといい


このフルーティーな食感は・・・


すごいな・・・


ありがとう。アレサ」


アレサ「そうですか


今川焼の製造にも着手しているところですの・・・」


ソーラー「おぉ  なんだか知らないところで


日々開発は進んでいるんだね」


アレサ「あと カスピ海ヨーグルトが大量生産されていますので


どうぞ 召し上がってください」


ソーラー「カスピ海ヨーグルトぉぉ


これがまた


普通のヨーグルトとは違う


ヘルシーなヨーグルトだよね


わおぅ 後でいただくとするよ」






マックス「お~い 俺のことわすれてないだろうな」







ソーラー「それでは


constをポインタ変数宣言の前に用いてポインタ変数宣言、初期化を行うと作製されたポインタ変数に格納されているデータを変更することはできません


となるかどうか


プログラムを構成して確かめてみよう



#include<stdio.h>


int main(void)

{


int a = 3;


const int *pta ;


pta=&a;


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


//変数宣言const int *pta ;と値を代入するpta=&a;が分離しています


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

constをポインタ変数宣言の前に使用する場合はポインタ変数宣言は

同時に初期化されている必要はありません*/


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


return 0;


}


(EAZY IDECの場合)


コンパイル結果

0019FF54



(Visual studioの場合)


ビルド実行結果

00EFF72C



ソーラー「あれ? おかしいな?」


アレサ「??」


ソーラー「確かconstを変数宣言の前に


const int aのように用いる場合は


const int a=1;


のように


作製される変数aの初期化が変数宣言と同時に


行われていないといけなかったような・・・


そうしないと


const int a;



int a=1;


と分離して記述すると


コンパイルエラーになるんだったね。


このプログラムの場合では


int a = 3;


const int *pta ;


  pta=&a;


のように


ポインタ変数宣言

const int *pta ;


ポインタ変数ptaに変数aのアドレス&aを代入する命令文

 pta=&a;


が分離して記述されているんだけど


コンパイルエラーが表示されていないね。


本来は


const int *pta=&a;


と記述されているべきなんだと


おもうんだけどな・・・


なぜなんだろう?」



アレサ「

では


const int *pta=&a;


と記述された場合の


プログラムを構成して


コンパイルしてみます。


#include<stdio.h>


int main(void)

{


int a = 3;


const int *pta = &a;


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


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

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


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


return 0;


}


(EAZY IDECの場合)


コンパイル結果

0019FF54



(Visual studioの場合)


ビルド実行結果

0091FA90


ソーラー「コンパイルできているか・・・


まあ コンパイルできるよね。


なんかおかしいな・・・


一応


ポインタ変数宣言にもconstはつけることができるみたいだね。


では次は


const int *pta = &a;


を行った後に


ポインタ変数ptaに


別のアドレス&b


が代入できるかどうか試してみよう。


const int *pta = &a;


が有効なら


ポインタ変数ptaに格納されているデータを


&aから&bに変更することはできないはずだね。」



#include<stdio.h>


int main(void)

{


int a = 3;


const int *pta = &a;


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


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

constをポインタ変数宣言の前に使用する場合はポインタ変数宣言は

同時に初期化されている必要はありません*/


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


int b=5;


pta=&b;


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


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


return 0;


}


(EAZY IDECの場合)


コンパイル結果

0091FF54

0019FF4C



(Visual studioの場合)


ビルド実行結果

00D3FA44

00D3FA2C


ソーラー「な、なんだ?


constを使用しているのに


ポインタ変数ptaに格納されているアドレスを


&aから&bに変更できている???


ちょっとまってよ


これは一体・・・


そうだ


ポインタ変数ptaに格納されているアドレスを


&aから&bに変更できているのは


よしとして


ポインタ変数ptaに格納されているアドレス番号のついたメモリに格納されている数値はどうなっているのかを確かめてみよう。


ポインタ変数ptaにアドレス&aが格納されているときは

アドレス&aのメモリに格納されている数値はどうなっているのか


ポインタ変数ptaにアドレス&bが格納されているときは

アドレス&bのメモリに格納されている数値はどうなっているのか


を確かめてみようってわけだね。」


アレサ「はい ソーラーさん


ではそのプログラムを構成してみます。


#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


ソーラー「なにィぃ


こ・・・これは・・・


アレサ 


constを使用しているのに


ポインタ変数ptaに格納されているアドレスは


&aから&bに切り替わり


なおかつ


*pta


に格納されている数値データも


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

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


変化している・・・」


ソーラー「これは


つまり


int a=3;


const int *pta = &a;


のように


constがint *ptaにつけられていても


ポインタ変数ptaに格納されているアドレスを


アドレス&aから別のアドレスに変更することができるし


かつ💖


constがint *ptaにつけられていても


*ptaに格納されているデータを


数値3から変更することができるということをあらわしているんだ。


つまり


constはポインタ変数宣言に使用した場合


機能していないんだね。」










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

作者を応援しよう!

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

応援したユーザー

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