發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0044
發信站: ☆清華電機☆ (Fri Jul 21 12:48:33 1995)
轉信站: star

星星流講座 0044         C 語言教室

第 7 講 之 2            使用者自定結構
                        Topic: Structure Operations (1)

我們只能對結構做四種操作:複製、初始化、取址以及取用它的元素。
現在先示範一下這四種操作,什麼叫做複製呢?就是把結構變數原封不動地
複製給另外一個相同結構型態的結構變數,例如:

/* struct1.c */
#include <stdio.h>

struct complex
{
    float re;
    float im;
};

void printc (struct complex c);

void main (void)
{
    struct complex a = { 1.0, 2.0 };    /* initialization */
    struct complex b;

    printc (a);
    b = a;              /* copy of whole structure */
    printc (b);
}

void printc (struct complex c)
{
    printf ("%f + %f i\n", c.re, c.im);
}

執行結果:

1.000000 + 2.000000 i
1.000000 + 2.000000 i

上面的程式中同時示範了初始化和複製的方法,請各位自行驗證。

有的時候結構變數本身是非常龐大的,它包含了太多的元素。這個
時候如果像上面的例子中把整個結構變數當成函數的參數 (printc
的參數是 struct complex c,即整個結構變數),函數的執行會變
得非常地沒有效率。 (回想一下前頭提過的,函數執行時必須先把
函數的參數存進推疊裡,然後把 IP 指過去之後,再把參數由堆疊
裡取出來。那麼,如果函數的參數體積很龐大,相對的存進堆疊和
由堆疊中取出的速度勢必會變慢,以致於降低了函數執行的效率)

這時候該怎麼辦呢?沒錯,用我們用在陣列上的老法子:用指標。

結構指標的宣告也很簡單,例如:

        struct complex A = { 1.0, 2.0 };
        struct complex *p;

        p = &A;         /* 取址 */


但是這時如果要取用 p 所指向的結構中的元素,就必須用下列兩
種方法之一了:

        (*p).re = 4.0;  /* 取用元素 */
        p->re = 4.0;


由於 . 和 -> 這兩個運算子牽涉到了有趣的運算子優先順序的問
題,所以我們下一講會特別地提出來討論一下。

--
本文原作者為徐振家,原作刊載於星星神教總壇 ☆清華電機☆ test 板。
你可以以電子文件的形式將本文自由流傳於台灣學術網路,但必須包含此版權聲明。
原作者依中華民國著作權法之規定,享有本文之著作權,請勿抄襲以免觸法。
未經授權任何人不得以任何形式對本文做任何修改及商業上之應用。
其他網路的轉載或其他用途的應用,請先知會作者,並取得其同意。
對本文有任何疑問或意見請 mail 給 ax.bbs@bbs.ee.nthu.edu.tw,謝謝。