指針結構與指針的關係亦有兩重:其一是在定義結構時,將指針做爲結構中的一個成員;其二是指向結構的指針(稱爲結構指針)。數組
前者同通常的結構成員同樣可直接進行訪問,後者是本節討論的重點。函數
結構指針說明的通常形式是:
struct (結構類型名稱) * (結構指針變量名);
例如:struct date * pdate, today;
說明了兩個變量,一個是指向結構date的結構指針pdate,today是一個date結構變量。加密
語句:spa
struct date{指針
int year;code
int month;blog
int day;內存
};
pdate = &today; get
通過結構變量today訪問其成員的操做,也能夠用等價的指針形式表示:
today.year = 2001; 等價於 (*pdate).year = 2001;
因爲運算符"*"的優先級比運算符"."的優先級低,因此必須有"( )"將*pdate括起來。若省去括號,則含義就變成了"*(pdate.year)"。input
在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指向數組的最後一個元素。
因爲結構指針和在結構中將指針做爲成員,使得對於結構變量的運算和對成員的操做變得較爲複雜。
因爲取內容的"*"與"."和"->"運算符的優先級與結合性不一樣,使得對成員的訪問和操做又增長了一層難度,
再由於"++"和"--"運算所具備的"先操做"與"後操做"的特性,
以及"++"和"--"運算的結合性,使得"++"和--"運算與結構操做混合在一塊兒時,實際操做會更爲複雜。