構造体メンバーのアクセス
構造体:インデックス への移動
構造体と共用体のメンバーには,以下の 2 つの選択演算子を用いてアクセスします。
- . (ピリオド)
- ->(右矢印)
たとえば,オブジェクト s は構造型 S,sptr は S を指すポインタであるとします。そして,m はデータ型 S で宣言されたデータ型 M のメンバー識別子であるとすると,式 s.m と sptr->m のデータ型は M で,両方とも S 内のメンバーオブジェクト m を表しています。式 sptr->m は,(*sptr). m の便利な同意語です。
演算子 . は,直接メンバー選択子と呼ばれています。また,演算子 ->: は,間接メンバー選択子(あるいはポインタメンバー選択子)と呼ばれます。次に例を示します。
struct mystruct
{
int i;
char str[21];
double d;
} s, *sptr = &s;
.
.
.
s.i = 3; // 構造体 s のメンバー i に代入
sptr -> d = 1.23 // 構造体 s のメンバー d に代入
式 s.m は,s が左辺値で,かつ m が配列型でない場合は,左辺値になります。式 sptr->d は,d が配列型でない場合,左辺値になります。
構造体 B のあるフィールドの型が構造体 A 型である場合,構造体 A のメンバーには,メンバー選択子を 2 つ組み合わせることによってアクセスできます。
struct A {
int j;
double x;
};
struct B {
int i;
struct A a;
double d;
} s, *sptr;
.
.
.
s.i = 3; // 構造体 B のメンバー i に代入
s.a.j = 2; // 構造体 A のメンバー j に代入
sptr->d = 1.23; // 構造体 B のメンバー d に代入
sptr->a.x = 3.14 // 構造体 A のメンバー x に代入
各構造体宣言ごとに,ユニークな構造体型が 1 つ導入されます。
struct A {
int i,j;
double d;
} a, a1;
struct B {
int i,j;
double d;
} b;
上のオブジェクト a と a1 はどちらも構造体 A 型ですが,a と b は別の構造体型です。構造体は,ソースとディスティネーションが同一のデータ型の場合にのみ,代入することができます。
a = a1; // OK: 同一の型,各メンバーごとに代入される
a = b; // NG: 異なる型
a.i = b.i; a.j = b.j; a.d = b.d /* メンバーごとになら代入できる */