Bootstrap

C语言-结构体成员遍历

C语言-结构体成员遍历

大家好,我是鸟哥

此方法试用的前提:结构体成员的数据类型相同 。话不多说,直接上手。
关于不同类型的结构体成员的遍历,已在另一篇文章中讲解

“结构体成员遍历”进阶版:当结构体里的成员数据类型不一样,可以计算出每个结构体成员的偏移量,并将偏移量放到一个数组中,遍历数组获取偏移量后再根据偏移去获取成员变量。这样取出了不同类型的结构体,直接进行赋值取值即可。进阶版的详细实现方法会在后期的另一篇文章中说明。

问题:
假设现在有一个结构体,成员都是int类型,现在需要对结构体的成员进行赋值或者取值。
将数值1-10分别赋给结构体成员Member_0到Member_9。

typedef struct
{
	int Member_0;
	int Member_1;
	int Member_2;
	int Member_3;
	int Member_4;
	int Member_5;
	int Member_6;
	int Member_7;
	int Member_8;
	int Member_9;
}Member_t;

问题解决思路:
给结构体的成员赋值,最基本的方法就是结构体直接赋值,具体的几种实现方法如下。

  • 结构体初始化赋值
    Member_t Member = { 1,2,3,4,5,6,7,8,9,10 };	//结构体初始化赋值
  • 单一成员赋值
	Member.Member_0 = 1;	//结构体成员分别赋值
	Member.Member_1 = 2;
	Member.Member_2 = 3;
	Member.Member_3 = 4;
	Member.Member_4 = 5;
	Member.Member_5 = 6;
	Member.Member_6 = 7;
	Member.Member_7 = 8;
	Member.Member_8 = 9;
	Member.Member_9 = 10;

上述两种方法适用于成员较少的结构体,当成员数量很多,并且需要统一赋值操作的时候,这两种方法就显得十分繁琐,低效。

为了让编写程序更加高效,让代码篇幅更少,可扩展性强,笔者总结了几种利用指针对结构体成员统一赋值的方法。具体实现如下:

	Member_t Member;		//结构体命名
	Member_t* P_Member = &Member;		//指向结构体的指针
	int* P = (int*)P_Member;		//结构体指针强制转换为int类型
	int i;
	for (i = 0; i < sizeof(Member) / sizeof(int); i++)
	{
		(*P++) = i + 1;
	}

我们可以定义一个int类型的指针,指针类型与结构体的成员类型保持一致,再通过强制类型转换,将结构体指针类型强制转换为int类型的指针,把指针P指向结构体指针。

注:不能直接把int类型的指针指向结构体或者结构体指针。这样的话,程序就会报错。因为结构体名字是经过typedef后的类型,而P指针是int类型,两者类型不一样,无法通过编译器的类型检查,程序会直接报错,所以不能直接将P指向结构体或者结构体指针。

	int* P = &Member;		//这是错误的指针访问

上述强制转化结构体指针类型的方法可以实现结构体成员的统一赋值,但是这种方法很危险,因为它避开了编译器的类型检查。

利用指针遍历结构体成员最正确安全的方法就是使用&操作符取得一个指向结构体内部int类型成员的指针P_Member->Member_0。具体实现如下:

	Member_t Member;		//结构体命名
	Member_t* P_Member = &Member;		//指向结构体的指针
	int i, * P;
	P = &P_Member->Member_0;		//int类型的指针P指向结构体的第一个成员
	for (i = 0; i < sizeof(Member) / sizeof(int); i++)
	{
		(*P++) = i + 1;
	}

结构体成员遍历输出结果:
在这里插入图片描述
我的微信公众号(ID:00后开发者)从00后的角度出发,专注但不局限于分享电气、嵌入式、机器视觉以及芯片行业的算法、技术文章和最新资讯。如果想查看更多内容,可以关注我的微信公众号。

;