構造体変数のアドレスをポインタ渡しすることによりゲームキャラの位置、ステータスデータを変更することができます ここでその仕組みを学んでいきましょう

構造体変数のメンバ変数に格納されている数値データをポインタ変数をつかって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


と表されるんだね


かっこいいね。」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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