指针结构与指针的关系亦有两重:其一是在定义结构时,将指针做为结构中的一个成员;其二是指向结构的指针(称为结构指针)。数组
前者同通常的结构成员同样可直接进行访问,后者是本节讨论的重点。函数
结构指针说明的通常形式是:
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指向数组的最后一个元素。
因为结构指针和在结构中将指针做为成员,使得对于结构变量的运算和对成员的操做变得较为复杂。
因为取内容的"*"与"."和"->"运算符的优先级与结合性不一样,使得对成员的访问和操做又增长了一层难度,
再由于"++"和"--"运算所具备的"先操做"与"后操做"的特性,
以及"++"和"--"运算的结合性,使得"++"和--"运算与结构操做混合在一块儿时,实际操做会更为复杂。