とりあえず struct をつかう


まずは、簡単なデータ構造、例えば複素数を表す struct をつくりましょう。 この場合、実数部(real part)と虚数部(imaginary part)をそれぞれ double real; double imag という field としてつくってしまいましょう。
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