変数のアドレスがポインタ変数に格納された場合 ポインタ変数をつかって変数内に格納されているをデータをもとめることができます💖
アレサ
「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に格納されている数値をあらわさなくなってしまうと
こういうわけなのじゃ~~
娘や~」
アレサ「はい、ソーラーさん、
ソーラーさんは
今回は この仕組みをかなり重複させて説明を試みたのですね 😊」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます