結構體指針
指針結構與指針的關系亦有兩重:其一是在定義結構時,將指針作為結構中的一個成員;其二是指向結構的指針(稱為結構指針)。
前者同一般的結構成員一樣可直接進行訪問,后者是本節討論的重點。
結構指針說明的一般形式是:
struct (結構類型名稱) * (結構指針變量名);
例如:struct date * pdate, today;
說明了兩個變量,一個是指向結構date的結構指針pdate,today是一個date結構變量。
語句:
struct date{
int year;
int month;
int day;
};
pdate = &today;
通過結構變量today訪問其成員的操作,也可以用等價的指針形式表示:
today.year = 2001; 等價於 (*pdate).year = 2001;
由於運算符"*"的優先級比運算符"."的優先級低,所以必須有"( )"將*pdate括起來。若省去括號,則含義就變成了"*(pdate.year)"。
在C語言中,通過結構指針訪問成員可以采用運算符"->"進行操作,對於指向結構的指針,為了訪問其成員可以采用下列語句形式:
結構指針->成員名;
這樣,上面通過結構指針pdate訪問成員year的操作就可以寫成:
pdate->year = 2001;
如果結構指針p指向一個結構數組,那么對指針p的操作就等價於對數組下標的操作。
結構指針是指向一種結構類型的指針變量,它是結構體在內存中的首地址。
結構指針具有一般指針的特性,如在一定條件下兩個指針可以進行比較,也可以與整數進行加減。
但在指針操作時應注意:進行地址運算時的放大因子由所指向的結構的實際大小決定。
例1:用結構指針改寫加密程序。
#include "stdio.h"
struct table{ char input; char output; }; /* 建立加密對照表 */
struct table translate[ ]={ 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i', 'i', 'a', 'k', 'b', ';', 'c', 'w', 'e' }; /*主函數*/ main( ) { char ch; /* p和pend為指向結構table的指針 */
struct table *p; struct table *pend; /* pend指向結構數組translate的最后一個元素 */ pend = & translate[ sizeof(translate)/sizeof(struct table)-1 ]; while ((ch=getchar( )) != '/n') { for (p=translate ; p->input!=ch && p!=pend; p++); if (p->input == ch) putchar(p->output); else putchar(ch); } }
讀者可以將兩個程序對照閱讀,體會結構指針特點。程序中用pend指向數組的最后一個元素。
由於結構指針和在結構中將指針作為成員,使得對於結構變量的運算和對成員的操作變得較為復雜。
由於取內容的"*"與"."和"->"運算符的優先級與結合性不同,使得對成員的訪問和操作又增加了一層難度,
再因為"++"和"--"運算所具有的"先操作"與"后操作"的特性,
以及"++"和"--"運算的結合性,使得"++"和--"運算與結構操作混合在一起時,實際操作會更為復雜。