和其他指针的定义类似的是,结构指针也是通过在结构变量名前面加星号“*”来定义。
例如:
struct date{
int year;
int month;
int day;
};
struct date *pd;
或者
struct date{
int year;
int month;
int day;
}*pd;
要使得结构指针指向struct date类型的结构变量,可以通过赋值的方法。如:
struct date workday;
pd=&workday;
要注意的是,这里赋给pd的初值是&workday。对于结构变量workday来说,&workday与&workday.year取值完全相同,但是二者类型是不同,&workday类型是struct date *,而&workday.year是int *类型的。
当然也可以在定义的同时初始化结构指针。如:
struct date{
int year;
int month;
int day;
}workday,*pd=&workday;
通过结构的指针引用结构的成员有两种方法,一种是通过间接访问算符“*”;另一种是通过成员选择运算符。
1 使用间接访问算符“*”引用结构成员
基本引用形式是:
(*结构的指针)·成员名
例如:
struct date weekday,*p=&weekday;
则通过结构的指针引用结构成员的表示形式如下所示
(*p).year /*等同于weekday.year*/
(*p).month /*等同于weekday.mongth*/
(*p).day /*等同于weekday.day*/
由于”·”运算符的优先级别高于“*”,所以圆括号不可少。注意不要把(*p).year写成*p.year,二者是不同的,*p.year等同于*(p.year),表示结构变量p的成员year是一个指针,而*(p.year)表示引用该成员指向的对象。可见*p.year是非法表示。
2 使用成员选择运算符“->”
C语言中为了使用方便和直观,用成员选择运算符“->”简化结构成员的指针引用形式,成员选择运算符又称为箭头操作符(arrow operator),由减号和大于好拼接而成。使用成员选择运算符引用结构成员的形式为:
结构的指针->成员名
例如:
struct date d,*p=&d;
则以下同一行的三个表达式是等价的。
p->year (*p).year d.year
p->month (*p).month d.month
p->day (*p).day d.day
例如:
struct stud{
char name[10];
long num;
struct date birth_date;
char sex;
}s,*ps=&s;
s是嵌套的结构变量,p是指向s的指针。则以下是引用同一个成员的四个等价的表达式:
s.birth_date.year (*ps).birth_date.year
ps->birth_date.year (ps->birth_date).year
成员选择运算符“->”的优先级别和结合性与“.”相同。
例如有如下变量定义:
struct {
int num;
char *name;
}s={1,”abcdefg”},*p=&s;
分析以下表达式的结果:
表达式 表达式结果 说明
p->num++ 1 先访问s.len,再把s.len加1
++p->num 2 s.len加1值变为2,后访问s.len
p->name s.name 表示字符串”abcdefg”
*p->name ‘a’ 访问s.name指向的对象,即字符’a’
*p->name++ ‘a’ 访问s.name指向的对象即字符’a’,然后使
p->name即s.name指向下一个字符’b’
(*p->name)++ ‘a’ 先访问p->name指向的对象即字符’a’,然
后使*p->name加1
例 6.2 分析下面程序的运行结果
#include <stdio.h>
void main(void)
{ struct {
int x;
int y;
}a[2]={{1,2},{3,4}},*p=s;
printf(“%d,”,++p->x);
printf(%d\n”,(++p)->x);
}
程序中定义结构指针p,初值指向结构数组a 。第一个输出函数要求输出表达式++p->x的值,按照运算符的优先级别,运算符“->”优先级别高于“++”。表达式++p->x等价与++(p->x),则表达式结果为2。
第二个输出函数中输出表达式(++p)->x的结果。表达式(++p)->x由于有括号,先执行++,p指向s[1];再取成员x的值。所以该表达式结果为3,表达式执行完后,指针变量p指向s[1]。
结构的指针最常见用在函数的参数和处理动态数据结构中,这些内容在后续内容中做详细介绍。
联系客服