前言
记录嵌入式学习的过程,C高级篇,避免头文件重复包含、mencpy与strcpy区别、结构体与共用体区别
避免头文件重复包含(重点)
//假设头文件名为demo.h
#ifndef _DEMO_H
#define _DEMO_H
//中间写要编写的代码
#endif
memcpy与strcpy函数
都需要引入头文件 #include <string.h>
都是用于复制数据的函数,但是在功能、用途和参数上存在一定的差异。对比如下:
- 参数类型
- 处理内容
strcpy专门用于复制字符串,包括字符串的结束符\0。
mencpy用于复制内存中的任意内容,不限于字符串,根据指定的字节数n来复制数据,不会复制\0作为结束符。- 安全性
strcpy在目标缓冲区大小不足够容纳源字符串时,可能会导致缓冲区溢出,进而引起安全问题。
mencpy通过指定复制的字节数来避免缓冲区溢出,相对的安全,但也需要自己去确保指定的字节数不会超过目标缓冲区的大小。- 用途
复制字符串时,使用strcpy。
需要复制非字符串类型的数据(如整型数组、结构体等)。应使用mencpy。
枚举
枚举enum,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
枚举类型就是特殊的整数。
#include <stdio.h>
//定义枚举类型
enum color
{
red,
yellow,
blue,
green
};
int main()
{
//声明枚举变量
enum color myColor;
//为枚举变量赋值
myColor = blue;
//省略下面配合 Switch语句的使用
return 0;
}
注意点
- 使用时一般不会用来定义变量;
- 是特殊的整数 ,可以应用switch-case语句中做判断;
- 枚举类型第一个成员如果没有显示赋值,默认值为0,后面的所有成员只要没有显示赋值就是上一个成员的值+1。
共用体(联合体)
多个成员变量公用一块内存,起始地址是一样的,同一时刻只能保证一个数据有效,相互会影响。
union data
{
int a;
char b;
float c;
};
结构体和共用体的区别
- 结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
- 结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。
typedef关键字
对原有的数据类型重新定义别名