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