構造体へのポインタ

複数の変数を組み合わせた構造体もまた、配列のように大きな領域を持つデータです。構造体へのポインタを取得することも可能ですが、この時に構造体のメモリ構造を意識する必要があります。構造体へのポインタは、配列へのポインタと同じように、その構造体の先頭のアドレスを(最初のメンバへのポインタ)を表します。構造体の実体は、メンバが宣言されている順に従って連続したメモリ領域が確保されています。たとえば、次のような構造体を考えてみましょう。

struct
{
    char m1;
    char m2;
} s ;

上の構造体 s は、char 型のメンバ m1 と m2 を持ちます。このとき、この構造体全体のサイズは char × 2 なので 2 バイトとなり、各メンバに割り当てられる領域は連続しています。つまり m2 メンバのアドレスは m1 メンバの直後となります。よって、構造体 s のアドレスは、m1 メンバのアドレスと一致します。

&s == &s.m1

上の式のように、構造体のメンバへのポインタを個別に取得することもできます。m2 メンバのアドレスを見れば、m1 メンバのアドレスに 1 を加えたものであることが確認できます。

Sample07

#include <stdio.h>

int main(void)
{
    struct
    {
        char m1;
        char m2;
    } s ;

    printf("&s=%p\n&s.m1=%p\n&s.m2=%p\n", &s, &s.m1, &s.m2);

    return 0;
}

実行結果

サンプル07の実行結果

Sample07 は、構造体の各メンバのアドレスの関係を調べるためのサンプルです。構造体 s のアドレスと、s のメンバのアドレスを printf() 関数で表示しています。&s と &s.m1 の結果が同じであることと、&s.m2 のアドレスが &s.m1 のアドレスに続いていることが確認できます。