struct complex { double real; double imag; };で終りです。これで、struct complex というレコードができあがりました。 アクセスするには、
struct complex a; struct complex * b; b = &a; // 構造体へのpointerをとりだす a.real += 1.0; // field へのアクセス b->imag += 2.0; // pointer からのアクセスでOKです。 使う方もこんな感じ(ソース)。とりあえず、データ置き場としては使えます。
int main(int argc, char** argv) { struct complex a = {1.0, 0.0}; /* 初期化も出来る */ struct complex * ap = &a; /* ap はポインタ。使ってない*/ struct complex b; /* b は構造体 */ b = a; /* これで、構造体の中身をすべてコピーしてくれる */ printf("a real %f imag %f address %x\n", a.real, a.imag, &a); printf("ap real %f imag %f p value %x\n", ap->real, ap->imag, ap); printf("b real %f imag %f address %x\n", b.real, b.imag, &b); a.real += b.real; /* field の中身を足しこむ */ a.imag += b.imag; printf("a real %f imag %f address %x\n", a.real, a.imag, &a); printf("ap real %f imag %f p value %x\n", ap->real, ap->imag, ap); printf("b real %f imag %f address %x\n", b.real, b.imag, &b); return 0; } /* 実行結果 a real 1.000000 imag 0.000000 address 7fff2ee8 ap real 1.000000 imag 0.000000 p value 7fff2ee8 b real 1.000000 imag 0.000000 address 7fff2f00 a real 2.000000 imag 0.000000 address 7fff2ee8 ap real 2.000000 imag 0.000000 p value 7fff2ee8 b real 1.000000 imag 0.000000 address 7fff2f00 */ちなみに、main の関数フレームの視覚的なイメージはこんな感じ。 a, bは、それぞれ double の field を二つもった構造体です。 で、フレーム上に作成されています。 一方で、 struct complex *(ポインタ)の ap は、 a の先頭アドレスを格納しているといった具合いです。
2002.10.5/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp