構造体変数のアドレスをポインタ渡しすることによりゲームキャラの位置、ステータスデータを変更することができます ここでその仕組みを学んでいきましょう
構造体変数のメンバ変数に格納されている数値データをポインタ変数をつかってprintf出力表示してみます
アレサ「今日のおいしいお題は
構造体変数のメンバ変数に格納されている数値データを
ポインタ変数をつかってprintf出力表示してみます
となっています」
ソーラー「具体的にはどういうことなのかな?」
アレサ「はいっ 😊 ソーラーさん
それを説明するために
ここでは
例として
次のように構造体宣言を行い
構造体Cubeを設定します
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
そしてcube1のCube型の構造体変数宣言を行います
cube1のCube型の構造体変数宣言は
Cube cube1;
👆のような表記方法でした。
このCube型の構造体変数cube1を初期化するには
Cube型の構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に
数値データ
1
7.0
7.0
7.0
を直接1つずつ
cube1. no=1;
cube1.tate=7.0;
cube1.yoko=7.0;
cube1. takasa=7.0;
のように代入して初期化する方法と
Cube cube1={1,7.0,7.0,7.0};
のように
簡略化された方法で初期化する方法とがあります
そして
Cube型の構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データを表示するには
printf("%d\n",cube1.no);
printf("%f\n" ,cube1.tate);
printf("%f\n" ,cube1.yoko);
printf("%f\n" ,cube1.takasa);
の命令文を実行すればよいのでした
そのプログラムは以下のようになります
#include <stdio.h>
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
int main(void){
Cube cube1={1,7.0,7.0,7.0};
printf("%d\n" ,cube1.no);
printf("%f\n" ,cube1.tate);
printf("%f\n" ,cube1.yoko);
printf("%f\n" ,cube1.takasa);
return 0;
}
コンパイル結果
1
7.000000
7.000000
7.000000
このようにして
Cube型の構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1. takasa
に格納されている数値データをprintf出力表示していました
今回は
Cube型の構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データ
1
7.0
7.0
7.0
を
ポインタ変数をつかって
printf出力表示してみようというわけです」
ソーラー「なあるほど~
構造体変数cube1のメンバ変数は数値データを格納しているから
もちろん
その数値データを格納している構造体変数cube1のメンバ変数のアドレス
つまり
その数値データを格納しているメモリのアドレス
があると・・・」
アレサ「そうなのです」
ソーラー
「そのアドレス情報を使って
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データ
1
7.0
7.0
7.0
を表示したい場合
そのcube1のメンバ変数である
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
のアドレスを格納するポインタ変数が
必要になってくるってことかな
アドレスを格納しているポインタ変数さえわかれば
そのアドレスのメモリに格納されている数値データも分かりそうな気がするね。」
アレサ
「はいっ🌞
そこで
構造体Cube型の構造体変数cube1のアドレス
&cube1を
格納できるポインタ変数を
次のようにポインタ変数宣言をおこない作製します。
Cube* pta;
(ここではptaのCube*型のポインタ変数宣言が実行されています
ポインタ変数の名前はptaでもpttomatoでも何でも構いません)
構造体Cube型の構造体変数cube1のアドレス&cube1を格納する
ptaの
ポインタ変数宣言において
ポインタ変数ptaを格納する型は
構造体変数cube1が格納されているCube型にアスタリスク*をつけた
Cube*型にするというきまりがあります。
ちょうど
int型の変数aのアドレス&aを格納する
ptaの
ポインタ変数宣言において
ポインタ変数ptaを格納する型は
int型の変数aが格納されているint型にアスタリスク*をつけた
int*型にするのと仕組みは同じです
Cube* pta;
を実行することにより
構造体変数cube1のアドレス&cube1を格納する
ポインタ変数
ptaが作製されますの」
ソーラー「おお 構造体変数cube1のアドレス&cube1を
格納するCube*型のポインタ変数ptaか
Cube型の構造体変数のアドレスを格納できるんだね。」
アレサ
「そうして
Cube*型のポインタ変数宣言
Cube* pta;
の実行により
作製されたポインタ変数ptaに
構造体変数cube1のアドレス
&cube1を次のように
pta=&cube1;
代入します
このとき
構造体変数cube1は
構造体変数cube1のメンバ変数
👇
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
👆
全体のメモリを管理しており
構造体変数cube1のアドレス&cube1は
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
を代表するアドレスとなっています
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
には数値データ
1
7.0
7.0
7.0
が
格納されています
その
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に
格納されている数値データを
🍓Cube*型のポインタ変数ptaをつかってあらわすためには🍓
🍓Cube*型のポインタ変数ptaに構造体変数cube1のアドレス&cube1を代入し🍓
🍓構造体変数cube1のアドレスが格納されているポインタ変数ptaに🍓
🍓🍓🍓アロー演算子->を用いて🍓🍓🍓
pta->no
pta->tate
pta->yoko
pta->takasa
と表記します
この
pta->no
pta->tate
pta->yoko
pta->takasa
が 構造体変数cube1が管理しているメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
の
メモリに格納されている数値データ
1
7.0
7.0
7.0
をあらわすというわけです。
いいかえると
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
を代表する構造体変数cube1のアドレス&cube1が代入された
Cube*型のポインタ変数ptaにアロー演算子->を用いた
pta->no
pta->tate
pta->yoko
pta->takasa
は
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に
格納されている数値データ
1
7.0
7.0
7.0
をあらわすというわけです。」
ソーラー
「早速
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データを表す
この
pta->no
pta->tate
pta->yoko
pta->takasa
をプログラムにつかってみよう😊」
アレサ「はいっ
そのプログラムは次のようになります」
#include <stdio.h>
typedef struct Cube{
int no;
float tate;
float yoko;
float takasa;
}Cube;
int main(void)
{
Cube* pta;
Cube cube1={1,7.0,7.0,7.0};
pta=&cube1;
printf("%d\n" ,pta->no);
printf("%f\n" ,pta->tate);
printf("%f\n" ,pta->yoko);
printf("%f\n" ,pta->takasa);
return 0;
}
コンパイル結果
1
7.000000
7.000000
7.000000
アレサ
「やはりはポイントは
💖pta=&cube1;💖
を実行し
Cube*型のポインタ変数ptaにアドレス&cube1を渡すということですね
そのようにして
構造体変数cube1のアドレス&cube1が
Cube*型のポインタ変数ptaに格納されることにより
pta->no
pta->tate
pta->yoko
pta->takasa
は
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
のアドレスのメモリに格納された数値データ
1
7.0
7.0
7.0
を表すことになり
printf("%d\n" ,pta->no);
printf("%f\n" ,pta->tate);
printf("%f\n" ,pta->yoko);
printf("%f\n" ,pta->takasa);
によって
コンパイル結果に
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
のアドレスのメモリに格納されている数値データ
1
7.000000
7.000000
7.000000
が表示されたというわけです💖
こうして 今日のお題
構造体変数のメンバ変数に格納されている数値データを
ポインタ変数をつかって表示してみることが
できましたですの。
ポイントは
🌞構造体変数cube1のアドレスが格納されているCube*型のポインタ変数ptaに🌞
アロー演算子->を用いるということですね
」
ソーラー「普通は
ポインタ変数ptaに格納されているアドレスのメモリに
保存されている数値データは*ptaと表されるんだけど
構造体変数cube1のアドレスが
Cube*型ポインタ変数ptaに格納された場合は
構造体変数cube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に格納されている数値データは
pta->no
pta->tate
pta->yoko
pta->takasa
と表されるんだね
かっこいいね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます