pit-rayの備忘録

開発中に得た知識を記事にしていくブログ

<C言語>構造体のアドレスは何を指すのか

本日はまたC言語についてのちょっとしたトピックを取り上げます。

構造体のアドレスは何を指しているのか?です。

まず、以下のプログラムを見ていきましょう。

#include <Windows.h>
#include <stdio.h>

typedef struct STRUCT_P_TEST {
    int a ;
    int b ;
} st_test ;

int main() {
    st_test st = { 5, 6 } ;

    //構造体、メンバのアドレスをポインタとしてコピー
    int* p_st   = ( int* )&st ;
    int* p_st_a = ( int* )&st.a ;
    int* p_st_b = ( int* )&st.b ;

    printf( "struct adress   = %p\n", p_st ) ;
    printf( "member a adress = %p\n", p_st_a ) ;
    printf( "member b adress = %p\n", p_st_b ) ;

    printf( "_ _ _ _ _ _ _ _ _ _ _ _ _\n" ) ;
    printf( "struct value    = %d\n", *p_st ) ;
    printf( "member a value  = %d\n", *p_st_a ) ;
    printf( "member b value  = %d\n", *p_st_b ) ;
    
    Sleep( 5000 ) ;

    return 0 ;
}

実行結果

struct adress   = 00AFFE74
member a adress = 00AFFE74
member b adress = 00AFFE78
_ _ _ _ _ _ _ _ _ _ _ _ _
struct value    = 5
member a value  = 5
member b value  = 6

動作環境
OS:Windows10
CPU:Core i5-4590

Windows.hはSleep関数を用いるためにインクルードしています。
このように構造体自体のアドレスというのは最初のメンバのアドレスと一致します
そのため、構造体のint型の値を取り出すと、当然最初のメンバの値が出てきます。

しかし、ここで注意したいのはint型(4バイト)で取り出しているこそ同じ値になっているだけで、取り出すサイズが違えば値も異なります
一致しているのはアドレスということに注目してください。

イメージとしてはこのような形です。

f:id:pit-ray:20180712230704j:plain
構造体のメモリ構造イメージ

では今日のまとめです。

構造体のアドレス=最初のメンバのアドレス


・参考文献
c - 構造体のアドレスと構造体の最初のメンバーのアドレスは同一であるとして良いか? - スタック・オーバーフロー

<C/C++> 入門者でも簡単に使えるゲーム用タスクシステムライブラリ無料配布

今回はゲーム用のタスクシステムをご紹介します。

タスクシステムは主に弾幕系シューティングゲームやストーリー系のゲーム全般に用いられています。
タスクシステムを用いることで、処理する関数の順番を決めたり、途中で特定の関数をストップできたりします。
これにより、キャラの登場や一時停止処理などが柔軟に扱うことができます。
といっても最近はUnreal Engine 4やUnityにより細部まで作る必要が無くなったため、あまり需要はないかもしれません。

しかし、C言語/C++に入門する方はDXライブラリなどと当ライブラリを用いて、ゲーム自体を作るのに専念できます。

入門してすぐにタスクシステムを構築しようとすると挫折してしまいがちですが、それを当ライブラリが代わりに処理してくれます。
プログラミングに入門する上で、ゲームなどを作りながら行うとモチベーションを保ちながら作れるため、是非利用してみてください。

また、タスク一つあたり28バイトなので省スペースで動かすことができます。

規約は以下の通りです。

1.本規約は、ユーザーと当ライブラリまたは当ライブラリを使用したプログラムに適用されます。


2.当ライブラリによる発生したトラブル等に関して、pit-rayは一切の責任を取りません。


3.禁止事項
(1) 犯罪行為に関連する行為
(2) 法令または公序良俗に違反する行為
(3) (1),(2)に関するプログラム等を作成するために間接的に当ライブラリを用いる行為


4.許可事項
(1)当ライブラリは商用、非商用どちらにも利用いただけます。
(2)当ライブラリを自由に改変、改良することができます。
(3)一言ご連絡していただいた場合に限り、再配布を認めます。


5.例外としてpit-rayが規約を変更した場合は、変更した規約に従うこととします。

from README.txt


ダウンロードファイルはzipファイルです。
また、ライブラリ自体はDLLになっております。アップデートする際はDLLを上書きしてください。

タスクシステムの説明や導入方法はかなり省いておりますので、分からないことがありましたら、お気軽にご質問ください。

zipでダウンロードする
リファレンスをみる