変数のアドレスがポインタ変数に格納された場合 ポインタ変数をつかって変数内に格納されている数値をもとめることができます💖 

アレサ


 「ポインタ変数ptaに変数aのアドレスを格納することができました。」


ソーラー 


「ぱちぱち、私はお前がここまで成長してくれて本当にうれし~よ。


アレサ、おと~さんはうれしいよ」


アレサ 


「ありがとうございます。お父様、どちらへ行かれていたのですか?」


ソーラー 「わしはちょっとPTAまでな。


いや、おう、おう、まちがっとった、


ちょっと天国までいっとったんじゃ・・・」


アレサ 「いきすぎかも・・・


よく戻ってこられました(^^)」


ソーラー「はい・・・」


アレサ 


「ポインタ変数ptaに変数aのアドレスを格納することができましたの。」


ソーラー「おと~さんはいつでもお前をみまもっていたよ」


アレサ 「みていてくれてたんです・・・か」


ソーラー 「ああ、もちろんお前の後ろで」


アレサ 「ありがとうございます。」


ソーラー「おおっ娘や~(^^)」


アレサ 「お父様~(^^)」


ソーラー「(^^)/」


アレサ 「(^^)/」


ソーラー「・・・なんか、


ふたりでボケるとどうしようもなくない?(^^)」


アレサ 「これでいいとおもいます・・・の・・・(^^)」



アレサ「それではっ!


つぎは


変数のアドレスから変数内に


格納してある数値をもとめてみようとおもいます。」


ソーラー「変数のアドレスがわかればその変数に格納されている


数値がわかるっていうことだよね。


なんか、便利っぽい感じがするね・・・」


アレサ「私もそうおもいます。


手順としては次のようになります。


int a=1;


と変数宣言されているとします。


まず


変数aのアドレスをポインタ変数ptaに格納し


その後


ポインタ変数ptaに演算子*を用いると


*ptaとなるのですが


この*ptaが


変数aのアドレスの場所に格納されている数値1をあらわしています


よって


この*ptaに%d出力変換指定子をもちいてprintf出力表示すると


変数aに格納されている数値1を


コマンドプロンプト画面に表示することができます。


ではでは. . .


具体的にプログラムを構成してみていきます。」


#include <stdio.h>


int main(void){

int a;

int * pta;

a=1;

pta=&a;

printf("変数aのアドレスは%pです。\n",&a);

printf("ポインタ変数ptaに格納されている値は変数aのアドレスと同じ%pです。\n",pta);

printf("変数aに格納されている値は%dです。\n",a);

printf("変数aに格納されている値は%dとなります。\n",*pta);

return 0;

}

コンパイル結果


変数aのアドレスは0019FF54です。

ポインタ変数ptaに格納されている値は変数aのアドレスと同じ0019FF54です。

変数aに格納されている値は1です。

変数aに格納されている値は1となります。


アレサ


「このプログラムの構成は 具体的には以下のようになっています。


まず


変数宣言      int a;

ポインタ変数宣言  int * pta;


を行い


次に

a=1;により

変数aに1を代入したあと


変数aのアドレス&aをもとめ


ポインタ変数ptaにその変数aのアドレス&aを


pta=&a;


と格納します


*演算子をポインタ変数ptaにもちいて


*pta と表記しますと


*pta は 変数aのアドレスのある場所に


格納してある数値を表します。


ですので


この*ptaを%d出力変換指定子をつかってprintf出力表示することにより


変数aのアドレスに格納してある数値1が


コマンドプロンプト画面に表示されるという構成になっています。」



ソーラー「この*pta の記述がミソだね。


🍓ptaに変数aのアドレスが格納されている場合🍓


ptaに*印がついたptaは


変数aに格納されている数値をあらわしているんだね(^^)


ポインタ変数ptaに*演算子を用いることによって


変数aのアドレスに格納されている値をもとめることができる・・・


か・・・


うん、僕が思うに


ポインタ変数ptaに*演算子を用いることによって


変数aに格納されている値をもとめることができるには


この例のように とにかくまず、




 🍋ポインタ変数ptaに変数aのアドレスが格納されていることが🍋




重要なんじゃないかな?


ポインタ変数ptaに変数aのアドレスを格納 しないということは


ポインタ変数ptaをということであり


その場合は


普通の変数を変数宣言後、初期化しないと


でたらめな数値、モンスター数値が その変数内に格納されているのと


同じように


ポインタ変数ptaに


でたらめなアドレス(数値)つまりモンスターアドレス(数値)(笑)が


格納されているんだよね。


ポインタ変数ptaに


でたらめなアドレスが格納された場合 


*ptaで表される数値は


そのアドレスに格納されている謎の数値になるわけで


ポインタ変数ptaに変数aのアドレスを格納したときとはちがって


*ptaで表される値は変数aに格納されている1とはならないんだよ。



🍅そもそもptaに格納されたアドレスが変数aのアドレスと違っている時点で



   😻変数aとptaは同じaという文字が使ってあっても


          全く何の関係もなくなり


 


 🍓*ptaは変数aに格納されている数値をまったくあらわしていない🍓



よね。


(ここまで来られた方はもう、うすうす お気づきと思いますが


変数を初期化しない場合はでたらめな数値が適当に


変数に格納されているのでなく


理由あってその数値が変数に格納されています。)


それでは


ポインタ変数ptaを初期化してない場合

(つまり変数aのアドレスを格納しない場合)


どのようなアドレスが


ポインタ変数ptaに格納されているのか


また*ptaには

どのような数値が格納されているか


順をおって


プログラムを構成して確かめていきましょう


#include <stdio.h>


int main(void){

int a;

a=1;

int * pta;


printf("変数aのアドレスは%pです。\n",&a);

printf("ポインタ変数ptaに格納されているアドレスの値は%pです。\n",pta);

return 0;

}


(EAZY IDECの場合)


コンパイル結果


変数aのアドレスは0019FF54です。

ポインタ変数ptaに格納されているアドレスの値は0019FF80です。


(Visual Studioの場合)


ビルド結果


エラー C4700 初期化されていないローカル変数 'pta' が使用されます

エラー MSB6006 "CL.exe" はコード 2 を伴って終了しました。


(このようにVisual Studioの場合 変数を初期化しなければビルドエラーが表示されます。)



ソーラー「このプログラムのように


ptaに変数aのアドレスを格納して初期化しなければ


変数aのアドレス0019FF54とは


違うアドレス0019FF80が


ポインタ変数ptaに格納されているのがわかるね。


この時、変数a、そのアドレス0019FF54のメモリには数値1が格納されています。


では 👆のプログラムで 


ポインタ変数ptaに格納されることになったアドレス0019FF80で表される場所には


どのような数値が格納されているのでしょうか?


変数aのアドレスが0019FF54なので


アドレス0019FF80は変数aのアドレスでないのはわかりますね。


アドレスが違うので異なった数値が格納されている可能性があります


このようにポインタ変数ptaと表記してあっても


変数aのアドレスを代入しなければ


ptaは


変数aのアドレスを格納しているポインタ変数ではないことを


表しています。



ではでは


今のように


ポインタ変数ptaに変数aのアドレス&aを格納する


pta=&a;


の命令文のない このプログラムの状態で


ポインタ変数ptaにはアドレス0019FF80が格納されることになりました


このとき


ptaに*演算子をもちいて*ptaで表される数値は


変数aのアドレス0019FF54とは異なる


アドレス0019FF80で表されるメモリに


格納されています。


あとは


*ptaに格納されている数値をもとめるには


次の命令文


printf("ポインタ変数ptaに格納されることになったアドレス0019FF80で表される場所に格納されている数値は%dとなります。\n",*pta);


を実行すればよいわけだよね。


それではっ!


そのプログラムを構成し実行すると


#include <stdio.h>


int main(void){

int a=1;

int * pta;


printf("変数aのアドレスは%pです。\n",&a);

printf("変数aに格納されている値は%dです。\n",a);

printf("ポインタ変数ptaに格納されているアドレスは%pです。\n",pta);

printf("ポインタ変数ptaに格納されることになったアドレス0019FF80で表される場所に格納されている数値は%dとなります。\n",*pta);


return 0;

}



EAZY IDECの場合


コンパイル結果


変数aのアドレスは0019FF54です。

変数aに格納されている値は1です。

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

ポインタ変数ptaに格納されることになったアドレス0019FF80で表される場所に格納されている数値は1703828となります。



Visual Studioの場合


エラー C4700 初期化されていないローカル変数 'pta' が使用されます



ソーラー 「アドレス0019FF80で表される場所に


格納されている数値は1703828


か・・・


まあ ようは


ポインタ変数ptaを初期化しないと違うアドレスが


ポインタ変数ptaに格納され


ptaは変数aのポインタ変数でなくなってしまうんだね。


だから*ptaは変数aに格納されている数値をあらわさなくなってしまうと


こういうわけなのじゃ~~


娘や~」


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


ソーラーさんは 


今回は この仕組みをかなり重複させて説明を試みたのですね 😊」



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

作者を応援しよう!

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

応援したユーザー

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