这篇文章内容介绍非常清楚,可以弄下来仅供参考。
指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点。
结构指针说明的一般形式是:
struct 结构类型名称 结构指针变量名;
例如:struct date pdate, today;
说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量。语句:
1
2
3
4
5 pdate = &today;
pdate today (struct date)
year
month
day
通过结构变量today访问其成员的操作,也可以用等价的指针形式表示:
today.year = 2001; 等价于 (pdate).year = 2001;
由于运算符”“的优先级比运算符”.”的优先级低,所以必须有”( )”将pdate括起来。若省去括号,则含义就变成了”(pdate.year)”。
在C语言中,通过结构指针访问成员可以采用运算符”->”进行操作,对于指向结构的指针,为了访问其成员可以采用下列语句形式:
结构指针->成员名;
这样,上面通过结构指针pdate访问成员year的操作就可以写成:
pdate->year = 2001;
如果结构指针p指向一个结构数组,那么对指针p的操作就等价于对数组下标的操作。
结构指针是指向一种结构类型的指针变量,它是结构在内存中的首地址,结构指针具有一般指针的特性,如在一定条件下两个指针可以进行比较,也可以与整数进行加减。但在指针操作时应注意:进行地址运算时的放大因子由所指向的结构的实际大小决定。
例11-7
用结构指针改写加密程序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "stdio.h"
struct table
{ char input, output;
} ;
struct table translate[ ]=
{ 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i',
'i', 'a', 'k', 'b', ';', 'c', 'w', 'e'
}; /* 建立加密对照表 */
main( )
{ char ch;
struct table *p, *pend; /* p和pend为指向结构table的指针 */
pend = & translate[ sizeof(translate)/sizeof(struct table)-1 ];
/* pend指向结构数组translate的最后一个元素 */
while ( (ch=getchar( )) != '/n')
{ for ( p=translate ; p->input!=ch && p!=pend; p++ ) ;
if ( p->input==ch )
putchar( p->output);
else
putchar (ch);
}
}
读者可以将两个程序对照阅读,体会结构指针特点。程序中用pend指向数组的最后一个元素。
由于结构指针和在结构中将指针作为成员,使得对于结构变量的运算和对成员的操作变得较为复杂。由于取内容的”*”与”.”和”->”运算符的优先级与结合性不同,使得对成员的访问和操作又增加了一层难度,再因为”++”和”–”运算所具有的”先操作”与”后操作”的特性,以及”++”和”–”运算的结合性,使得”++”和–”运算与结构操作混合在一起时,实际操作会更为复杂。
例11-8
请分析程序的运算结果。
1 | #include "stdio.h" |
结构数组array的初始化后的状态如图11.4所示。程序中指针操作的含义如下:
1 | p->x /* 取结构指针p指向的结构的成员x的值,输出 100 */ |
例11-9
可用一个结构表示学生的学号和成绩,编写程序,对班中30名学生按成绩进行排序,并输出排序后的学号、成绩和全班平均分。
1 | #define STNUM 30 /* 全班同学人数 */ |
总结
程序中使用了较为复杂的数据结构,包括:结构数组stu,指向结构的指针ptemp,由指向结构的指针构成的指针数组p。
程序在结构数组stu和指针数组p之间建立了对应的指针关系,从而为简化后续处理打下了良好的基础。在排序过程中,程序使用选择排序的思想,先查找确定当前的最大值,再进行一次有实效的数据交换。进行数据交换时,也没有交换结构数据本身,而是交换了指向结构数据的指针。在输出时,按照排序后指针的顺序,输出排序后的数据。