C语言学习笔记---结构体指针

  既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体。下面通过一个简单的例子来演示一下:

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

  通过三种不同的方法来访问结构成员,输出结果如下:
C语言学习笔记---结构体指针
  通过打印的结果也可以看出,这三种方式访问具体的对象是等效的。

上一篇:微信公众平台,微信接入及消息回复


下一篇:微信连接转发后无法获取地理位置问题解决