既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体。下面通过一个简单的例子来演示一下:
struct Date
{
int year;
int month;
int day;
};
struct book
{
char title[30];
char author[30];
float value;
struct
{
int year;
int month;
int day;
};
};
首先声明一个结构体,这里用结构体来存储书本的信息,包括书本的标题、作者、价格、出版日期。其中出版日期也是一个结构体,这里声明出版日期时使用的是匿名结构声明,没有具体的结构名称。它嵌套在书本结构体中。接下来初始化结构体。
struct book books=
{
"语文","张三",19.8,{2021,10,1}
};
struct book *bks;
bks = &books;
定义了一个结构体变量books,在定义的时候直接初始化。接着定义了结构体指针,将books的地址赋值给指针。这里要注意一下,结构体的变量名并不是结构体的指针,所以在给指针赋值的时候,必须要使用取值运算符&来获取结构体变量的指针。接下来就可以使用指针来访问结构体的成员了。
printf("%s %s %f %d-%d-%d\r\n",books.title,books.author,books.value,books.year,books.month,books.day);
printf("%s %s %f %d-%d-%d\r\n",(*bks).title,(*bks).author,(*bks).value,(*bks).year,(*bks).month,(*bks).day);
printf("%s %s %f %d-%d-%d\r\n",bks->title,bks->author,bks->value,bks->year,bks->month,bks->day);
这里使用了三种不同的方式来访问结构体的成员,第一种是直接通过变量加点号的方式来访问具体的成员。虽然日期信息也是一个结构体,但是由于它是匿名的,所以通过变量名加点的方式也可以直接访问到日期成员的信息。如果日期结构体不是匿名的,那么访问日期的时候,就必须使用两次点号才能访问到。
第二种是通过指针来访问具体对象,由于 bks = &books ,那么 *bks = books,因为 & 和 * 是一对互逆运算符,所以可以做如下的替换:
books.title == (*bks).title
这里的 bks 必须要加圆括号,因为.运算符的优先级比运算符优先级高。如果不加圆括号就相当于 *(bks.title),这里一定要记得加括号。
第三种方法是用指针访问结构体的最常用方法,使用 -> 运算符,指向结构体指针的后面加 -> 运算符和变量后面加 . 运算符的是等效的。
books.title == bks->title
这个和第二种指针的用法也是等效的。
books.title == (*bks).title == bks->title
通过三种不同的方法来访问结构成员,输出结果如下:
通过打印的结果也可以看出,这三种方式访问具体的对象是等效的。