欢迎光临
我们一直在努力

构造数据类型(嵌入式-C语言进阶)

今天我们继续对C语言进行一个学习,首先我们就先把上次对结构体没有讲解完的内容,先讲解一下,对于基本数据类型讲解完概念和应用,还包括它的数组形式,所以我们来讲一下结构体数组的相关内容。

1、结构体数组

1.1 定义

数据类型 数组名[元素个数];

struct student s[3];

1.2 初始化

struct student s[3] = {
{"zhangsan", 'm', 19, 100},
{"lisi", 'f', 18, 90},
{"wangwu", 'm', 20, 99}
};

结构体就为大家讲解完了,接着给大家讲解第二种构造数据类型,共用体。

2、共用体(联合体)

2.1 共用体定义

union 共用体名{
数据类型1 成员变量1;

};

2.2 共用体变量定义

union 共用体名 变量名;

结构体成员变量空间独立,共用体所有成员变量共用同一空间

就是说共用体不是像结构体中那样的成员变量都有属于自己的空间,在共用体中,所有成员变量共用一个存储空间,这样那个存储空间如果要放下所有的成员变量,它的存储空间就得是里面成员变量所占存储空间最大的那个,才能每次放下不同的成员变量,才不会溢出。

说完我们再来聊一聊什么是内存大小端:

2.3 内存大小端

内存低地址存放低数据位,内存高地址存放高数据位,称为内存小端;

内存低地址存放高数据位,内存高地址存放低数据位,称为内存小端

(1)利用共用体判断大小端:

#include <stdio.h>

// 定义共用体:int和char共享同一块内存
typedef union {
int num; // 4字节整型,存储测试值
char ch; // 1字节字符,读取低地址第一个字节
} Endian_Check;

int main(void) {
// 大小端判断函数:返回1=小端,0=大端
Endian_Check ec;
ec.num = 1; // 给整型赋值1,二进制0x00000001
// 读取低地址第一个字节:等于1则小端,否则大端
if (ec.ch == 1) {
printf("当前系统为【小端模式】\\n");
} else {
printf("当前系统为【大端模式】\\n");
}
return 0;
}

(2)利用指针判断大小端:

#include <stdio.h>
int main() {
int x = 0x12345678;
char *p = (char*)&x;
if (p[0] == 0x78)
printf("小端\\n");
else if (p[0] == 0x12)
printf("大端\\n");
else
printf("未知端序\\n");
return 0;
}

然后,我们还有一个构造数据类型还没讲,就是枚举,再来看看枚举是什么,和结构体,共用体又有什么不同吧。

3、枚举

3.1 枚举类型定义

enum 类型名{
枚举常量1,
枚举常量2,

枚举类型m
};

枚举常量的值都为整型,每个枚举常量的值都为前一个枚举常量的值+1,第一个枚举的常量值为0

注意:

这里,枚举类型里面的成员变量后用的‘,’,不像结构体和共用体那样,是‘;’,这点得注意

示例:

#include <stdio.h>

// 方式1:默认赋值(从0开始,依次+1)
enum Color {RED, GREEN, BLUE}; // RED=0, GREEN=1, BLUE=2

// 方式2:手动指定第一个常量,后续自动+1
enum Week {MON=1, TUE, WED, THU, FRI, SAT, SUN}; // MON=1, TUE=2…SUN=7

// 方式3:随意手动赋值(无规律也可以)
enum Status {SUCCESS=100, FAIL=200, ERROR=300, TIMEOUT=404};

int main() {
// 打印枚举常量的值(本质是整数)
printf("RED = %d\\n", RED); // 0
printf("MON = %d\\n", MON); // 1
printf("SUCCESS = %d\\n", SUCCESS);// 100
return 0;
}

//终端输入
enum weekday day;
scanf("%d", (int *)&day);

枚举常量必须是「合法的 C 语言标识符」,只能由字母、数字、下划线组成,且不能以数字开头,更不能是字符串。

到这儿,构造数据类型也给大家讲解完了,接下来在为大家讲解一下位操作,也是十分重要的,因为我们在后面对一些单片机,驱动啊,操作基本都是对位去操作的,所以,也好好来跟博主掌握一下吧!

4、位运算

4.1 分类

&        按位与

|        按位或

^        按位异或

~        按位取反

<<        左移

>>        右移

与0得0;

或1置1

异或:相同为0,相异为1

4.2 应用场景

(1)不改变其余位的情况下,让num第n位置1

num |= (1 << n);

(2)不改变其余位的情况下,让num的第n位置0

num = num & ~(1 << n);

(3)异或可实现两个数的交换

int num1 = 2;

int num2 = 4;

 

num1 = num1 ^ num2;

num2 = num1 ^ num2;

num1 = num1 ^ num2;

第三个数据交换,大家是不是没想明白呢,那我给各位详细讲一讲吧,这种方法比我们直接值拷贝,会快一些:

//这里就为大家简写了,就不写32位了,这里只用到了4位,我们就用4位来操作吧
//先对这个异或的两个用法讲解下:
a ^ a :
1111
^
1111
=
0000
//故:a ^ a = 0;

a ^ 0:
1111
^
0000
=
1111
//故: a ^ 0 = a

//所以,这里:
num1 = num1 ^ num2;
num2 = num1 ^ num2 = (num1 ^ num2 )^ num2 = num1; //这里就已经把num1的值赋给了num2了
num1 = num1 ^ num2 = (num1 ^ num2) ^ (num1) = num2;
//到此,交换完成

位运算的话,大家现在就先掌握这么多,牢记会用就好。

今天到这里的话,给大家讲解的内容也不少了,我们的C语言学习也快要结束了,时间总是那么的快,每一个知识点的学习,各位友友都掌握了吗?如果你已经都掌握了,说明你的实力很强,没完全掌握也不要气馁,多回顾总结,多用就会慢慢掌握了,那我们就下次见了!

    赞(0)
    未经允许不得转载:171主机测评 » 构造数据类型(嵌入式-C语言进阶)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址