欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 嵌入式学习之路 17(C语言基础学习——结构体、共用体、枚举、位运算)

嵌入式学习之路 17(C语言基础学习——结构体、共用体、枚举、位运算)

2025/2/24 0:49:19 来源:https://blog.csdn.net/weixin_63556308/article/details/141057441  浏览:    关键词:嵌入式学习之路 17(C语言基础学习——结构体、共用体、枚举、位运算)

结构体类型(构造类型——用户自定义类型):用来描述复杂数据的一种数据类型。

结构体

结构体是一种用于描述复杂数据的用户自定义数据类型。

语法:

struct 结构体名
{成员列表;
} ;

  • struct 关键字:表示正在构造一个结构体类型。
  • 结构体名:用于描述结构体类型的名称。
  • 成员列表:包含要描述的复杂数据中用到的具体成员变量,定义方式与普通变量相同,多个成员变量之间用分号隔开,最后有一个分号表示结束。

例如:

struct student 
{char name[30]; int sno;float score;char sex;  
};

定义变量:

struct 结构体名 变量名;

初始化: 

struct student s = {};

按照成员变量的数据类型依次初始化。

结构体变量的引用:
使用 结构体变量名.成员名 访问成员。

 结构体类型的定义形式:

  • 先定义类型,然后定义变量:
struct demo
{}; 
struct demo d;
  • 定义类型的同时,定义变量:
struct demo
{
}d;
  • 定义类型的同时,定义变量且省略结构体名(结构体类型只用一次):
struct 
{
}d;

结构体类型的大小:
在 32 位平台上,默认按 4 字节对齐。对于成员变量,各自在自己的自然边界上对齐。如果成员变量中有比 4 字节大的,整个结构体按 4 字节对齐;如果没有,则按最大的成员对齐。

在 64 位平台上,如果超过 4 字节的,按超过的最大的成员变量对齐;如果没有超过 4 字节的,则按成员变量中最大对齐。

同类型的结构体变量之间可以相互赋值。

#include <stdio.h>// 定义一个名为 student 的结构体
struct student
{int sno;    // 学号char name[10];  // 姓名int sex;    // 性别(0 表示女,1 表示男)float score;  // 成绩
};int main(int argc, const char *argv[])
{// 定义并初始化一个名为 s 的 student 类型结构体变量struct student s = {110,"tom",1,59.9};// 打印学号printf("sno    = %d\n",s.sno);// 打印姓名printf("name   = %s\n",s.name);// 打印性别printf("sex    = %d\n",s.sex);// 打印成绩,保留两位小数printf("score  = %.2f\n",s.score);// 定义并初始化一个名为 s 的 student 类型结构体数组,包含 3 个元素struct student s[3] = {{110,"tom",1,59.9},{111,"tony",0,81.2},{112,"jack",1,94.1}};// 计算并打印数组中三个元素的成绩平均值,保留两位小数printf("%.2f\n",(s[0].score+s[1].score+s[2].score)/3);// 分别定义并初始化三个 student 类型结构体变量 s1、s2、s3struct student s1 = {110,"tom",1,59.9};struct student s2 = {111,"tony",0,81.2};struct student s3 = {112,"jack",1,94.1};// 计算并打印这三个变量的成绩平均值printf("%f\n",(s1.score+s2.score+s3.score)/3);return 0;
}

qsort 函数

void qsort(void *base,    //要排序的数组的首地址 size_t nmemb,  //数组元素的个数 size_t size,   //单个元素的大小 int (*compar)(const void *, const void *) //比较函数 --- 提供比较依据
);

 比较函数:

int compar(const void *a, const void *b) 
{  // 比较逻辑
}

共用体

语法:

union 共用体名
{成员变量;
};

例如:

union demo
{char a;short b;int c;
};

共用体特点:
共用一块内存空间,共用了最大成员的空间。

注意事项:

  • 共用体初始化时,只能给一个值,默认给到第一个成员。
  • 共用体变量中的值取决于最后一次给到的值,还要看能影响几个字节。

对比结构体:

  • 结构体中各个成员拥有自己独立空间。
  • 共用体中,成员共用一块空间。

考点:用共用体判断大小端。例如通过判断共用体中不同类型成员的存储顺序来确定大小端模式

枚举

枚举是将变量的值一一列举出来,以提高代码可读性和安全性。

语法:

enum 枚举名
{列举各种值  //枚举元素//枚举常量
};

例如: 

enum fire 
{LITTLE_FIRE,MIDDILE_FIRE, LARGE_FIRE, 
};

枚举的特点:

  1. 列举的值默认从 0 开始,若有给定值,则后续未给定值的枚举元素依次加 1。
  2. 枚举类型本质是 int 类型数据,枚举类型的变量与整型变量通用。

位运算

位运算可以直接操作二进制位,包括:

  1. & 与运算:一假则假,可用于清 0。
  2. | 或运算:一真则真,可用于置 1。
  3. ~ 取反运算:真假相对。
  4. ^ 异或运算:相同为 0,不同为 1。

位移运算:

  1. << 左移:最低位补 0,左移 1 位相当于乘 2。
  2. >> 右移:对于有符号类型,右移时最高位补符号位;对于无符号类型,最高位补 0。

函数指针和指针函数

函数指针是指向函数类型的指针,指针函数是返回值为指针类型的函数。

堆空间操作

使用 malloc 函数在堆上开辟空间,使用 free 函数释放堆空间。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词