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

アレサ


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


ソーラー 


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


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


アレサ 


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


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


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


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


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


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


ソーラー「はい・・・」


アレサ 


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


ポインタ変数を格納する型には


int*型


float*型


等の型があるのですの」


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


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


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


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


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


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


ソーラー「(^^)/」


アレサ 「(^^)/」


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


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


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



アレサ「それではっ!


つぎは


int型の変数のアドレスから


そのint型の変数内に


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


ソーラー「変数のアドレスがわかれば


その変数に格納されている


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


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


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


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



変数宣言、初期化


int a=1;


を実行します


次に


int*型のポインタ変数宣言


int* pta;


を実行します


このとき


変数aのアドレスは&aで表されるので


変数aのアドレス&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);//💖*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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る