發信人: 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,謝謝。