嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算

目录

一、结构体(struct关键字)

(一)声明一个结构体数据类型

(二)结构体的成员初始化与赋值

a、结构体变量赋值

b、结构体成员初始化

c、结构体的定义形式

(三)考点:结构体在内存中所占字节数

(四)对结构体成员进行输出

(五)例题

二、共用体(union关键字)

三、枚举(enum关键字)

四、typedef关键字

五、位运算

[(一)& 按位与](#(一)& 按位与)

[(二)| 按位或](#(二)| 按位或)

[(三)^ 按位异或](#(三)^ 按位异或)

[(四)~ 取反](#(四)~ 取反)

[(五)<< 左移](#(五)<< 左移)

[(六)>> 右移](#(六)>> 右移)

一、结构体(struct关键字)

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

(一)声明一个结构体数据类型

1、语法:

struct 结构体名//创建抽象的数据类型

{

成员列表;

};

2、理解:

(1)struct关键字表示在构造一个结构体类型;

(2)结构体名是用来描述结构体这个类型的一个名称;

(3)成员列表,它定义的形式,与之前的定义变量的方式是相同的,也用之前的那些

数据类型定义,它不仅可以定义变量,还可以定义数组和指针变量;

多个成员定义变量的时候,注意要用分号隔开;

成员列表表示要描述的复杂数据中用到的具体的成员变量;

(4)特别注意在最后的花括号后面要加一个";"。

3、示例:

4、结构体类型的使用:首先先定义出一个类型,再去定义需要的变量,

定义变量的形式是:struct 结构体名 变量名 即 结构体类型+变量名

eg:struct Student s;

(二)结构体的成员初始化与赋值

a、结构体变量赋值

1、示例:

注:(1)" . "为结构体成员运算符,优先级为1级,结合方向自左至右;

(2)不能写成s.name = "zhangsan";编译报错,数组不能被整体引用。

3、结构体变量与变量之间可赋值,示例:

b、结构体成员初始化

1、形式: struct student s={};

初始化的时候,看每个成员变量具体是什么数据类型,然后根据各个成员变量自身的数据类型进行初始化;

示例:struct student s={1,"zhangsan",99};//此方法做不到只初始化一个成员

2、初始化次序不能颠倒应与结构体声明顺序保持一致;

3、结构体成员的部分初始化

示例:struct student s={ .id = 1};//其他未初始化的部分全为0;

struct student s={ .name = "zhangsan" , .score = 99};//用逗号隔开

c、结构体的定义形式

形式1:先定义类型,然后定义变量

  1. struct Student

  2. {

  3. };

  4. struct Student s;

形式2:定义类型的同时定义变量

  1. struct Student

  2. {

  3. }s;

示例:声明结构体的同时定义了两个全局变量(s1,s2)

(三)考点:结构体在内存中所占字节数

内存对齐原则:

1、默认按照计算机位数对齐,64/8=8最终大小必须是8的整数倍;(32位系统下默认4字节对齐)

2、从结构体中的成员中查找最大字节的成员,最终按此成员大小对齐;

3、把每个成员按照声明顺序依次存放入内存,偏移量/sizeof(成员)必须能够整除。

(注:32位的平台 :如果有超过4字节 ,按照4字节对齐;如果没有超过4字节的,则

按成员变量中最大对齐 ;64位的平台:如果超过4字节的,按超过的最大的成员变量对

齐,如果没有超过4字节的,则按成员变量中最大对齐)

示例:

图中代码printf("%lu\n",sizeof(struct Demo));运行结果为12(占12个字节)

注:内存对齐的原因:空间换时间,提高程序运行效率

(四)对结构体成员进行输出

1、->:指向结构体成员运算符;

2、指针用指向结构体成员运算符(->),变量用结构体成员运算符(.);

3、输出函数1:

注:该函数为值传递(过程需要拷贝);不建议使用

4、输出函数2:

注:该函数为指针传参(效率更好)

(五)例题

1、结构体的遍历

2、采用回调函数按学生成绩排序

3、采用qsort函数按学生名字排序

二、共用体(union关键字)

1、共用体:(union)它是共用一块内存空间(共用了最大成员的空间);

2、语法:

union 共用体名

{

成员变量;

};

3、示例:

4、共用相同的内存空间(所以称为共用体)

运行结果:4(共占4个字节)

5、访问时只有最后被赋值的变量是有效的(彼此内存相互覆盖)

运行结果为1

6、4个字节被3个长度不同的变量共享时,共享总是从起始部分开始共享的(所有成员起始地址是相同的);

7、用共用体判断计算机大小端存储:

三、枚举(enum关键字)

1、含义:将变量的值一个一个列举出来;变量的值只限于列举出来的值的范围内;

2、作用:为了提高代码的可读性;

3、语法

enum 枚举名

{

列举各种值,//不是成员,是可能的取值(全为常量)

};

注:列举各种值时,用逗号隔开,不需要类型名;

4、注意事项:

(1)枚举中逐个列举的值,默认是从0开始;如果有给定的值,则后续没有给值的枚举成员依次加1;

(2)枚举本质是一个int 类型的数据(可以放在switch中使用);

(3)每个值可以用%d输出。

5、示例:

运行结果:sleep

运行结果为4

运行结果为2(列举的值默认从0开始)

运行结果为13(有给定的值,后续没有给值的枚举常量依次+1)

四、typedef关键字

1、typedef------type define

它的本意不是定义类型 ,是给已有的数据类型起别名。

eg:

int a ;//定义了一个int 型变量,a为变量名(具体)

typedef int a; //此时a是int类型的类型名(抽象)

2、示例:

运行结果为4

3、作用:避免写长长的关键字;

此时Student为类型的类型名(抽象)

4、不建议使用其简化,代码可读性差;

示例:

a为数组整型,运行结果为40

a为函数的指针的数组,sizeof(a)为80

五、位运算

(一)& 按位与

1、& :双目运算符,优先级为8级,结合方向自左至右;

2、运算规则:一假则假 (任何一个为0,其结果必然为0;两个都为1,其结果为1);

3、作用:指定位清零;

4、示例:

1001 1110

0011 0010 &


0001 0010

(二)| 按位或

1、|:双目运算符,优先级为10级,结合方向自左至右;

2、运算规则:一真则真 (任何一个为1,其结果必然为1;两个都为0,其结果为0);

3、作用:指定位置1;

4、示例:

1001 1110

0011 0010 |


1011 1110

(三)^ 按位异或

1、^:双目运算符,优先级为9级,结合方向自左至右;

2、运算规则:相同为0,不同为1;

3、作用:指定位翻转,其他位不变;

4、示例:

1001 1110

0011 0010 ^


1010 1100

(四)~ 取反

1、~:单目运算符,优先级为2级,结合方向自右至左;

2、运算规则:按位取反(将0变1,1变0);

3、示例:

1001 1110 ~


0110 0001

(五)<< 左移

1、<<:双目运算符,优先级为5级,结合方向自左至右;

2、写法:a<<n (表示将a这个数据左移n位 )(C语言中为逻辑左移)

3、最高位无论是1还是0全丢掉,后面补0;

4、作用:指定位清零( ~(1 << n));

5、示例:

0000 0001

0000 0010

左移1位 相当于乘 2

(六)>> 右移

1、>>:双目运算符,优先级为5级,结合方向自左至右;

2、写法:a>>n(表示将 a这个数据 右移 n位)

3、算术右移是看符号位和看数据类型的:

(1)有符号数据类型,右移时,最高位补的是符号位; (算术右移)

(2)无符号类型的数据,右移时,最高位补的0 ;(逻辑右移)

注:在使用右移运算符时最好定义无符号数据类型(eg:unsigned char)

4、示例:

1000

1100


0100

0010

右移1位 相当于除 2

相关推荐
10000hours19 分钟前
【SGL】Scatter-Gather List内存传输技术
linux·数据结构·网络协议·list·存储·sgl
海盐泡泡龟1 小时前
ES6新增Set、Map两种数据结构、WeakMap、WeakSet举例说明详细。(含DeepSeek讲解)
前端·数据结构·es6
少了一只鹅1 小时前
深入理解指针(3)
c语言·数据结构·算法
似水এ᭄往昔2 小时前
【数据结构】——双向链表
c语言·数据结构·c++·链表
有一个好名字2 小时前
力扣:轮转数组
数据结构·算法·leetcode
fpcc2 小时前
跟我学C++中级篇——STL容器的查找对比
数据结构·c++
菜鸟破茧计划3 小时前
线段树:数据结构中的超级英雄
数据结构·c++·算法
找不到、了3 小时前
JDK8 HashMap红黑树退化为链表的机制解析
java·数据结构·链表
iceslime4 小时前
算法设计与分析实验题-序列对齐
数据结构·c++·算法·算法设计与分析·序列对齐