0121嵌入式C学习日志
作者:互联网
关键字
static 静态类 //只有函数在多次调用时定义
局部变量加static会将存储位置从栈区存到全局变量区
全局变量声明static只有当前文件能使用
const关键字
const int* a; int const *a; 指针常量
是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。
int* const a; 常量指针
a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。
int const * const a;
a是一个指向const int型的const指针,因此*a和a都不允许改写
extern 存储类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
struct 结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,
struct NODE {
char string[100];
struct NODE *next_node;
};
struct COMPLEX {
char string[100];
struct SIMPLE a;
};
如果两个结构体互相包含,则需要对其中任意一个结构体进行不完整声明,
struct B; //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A {
struct B *partner;
//other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B {
struct A *partner;
//other members;
};
结构体成员引用:结构体变量名.成员名 || 结构体变量名->成员名
如 stu.num stu.name stu.score
(*p).num (*p).name (*p).score
p->num p->name p->score
结构体赋值
解决内存空洞
同类型的成员定义放在一起
32位
若存在int型则结构体按字对齐(四字节) 若存在short型不存在int型按半字对齐(2字节)
数组名不能作为左值 给字符数组赋值只能用拷贝 strcpy(stu1.name,”Li Ming”);
不能将一个结构体作为一个整体进行输入输出
union 联合体/共用体
当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体; 当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处;
字节序转换
存放顺序
大端和小端
可通过union共用体 来查看电脑的大小端排列
网络字节序就是大端字节序
枚举enum //避免幻数
enum默认值 为 0,1,2,3,4 ...........
enum kids{nippy, slats, skippy, nina ,liz};//nippy = 0 ;slats = 1..........
*没有传递性
int* a,b; a是指针 b是整数变量
typedef 数据类型
typedef是C语言的关键字,其作用是为一种数据类型定义一个新名字
格式:typedef 数据类型 自定义数据类型
C语言宏定义和宏定义函数
define MAX(a, b) ((a)>(b)?(a):(b))
k = MAX(i&0x0f, j&0x0f)
k = ((i&0x0f)>(j&0x0f)?(i&0x0f):(j&0x0f))
带参数的宏体,形参要加上(),将执行频率高的函数定义成宏函数以此提高程序效率
只有简单函数可以写成宏函数
一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。
看下面的例子:
#define MALLOC(n, type) \
( (type *) malloc((n)* sizeof(type)))
利用这个宏,我们就可以为任何类型分配一段我们指定的空间大小,并返回指向这段空间的指针。我们可以观察一下这个宏确切的工作过程:
int *ptr;
ptr = MALLOC ( 5, int );
将这宏展开以后的结果:
ptr = (int *) malloc ( (5) * sizeof(int) );
这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的方法是把它实现为一个函数
判断
if
一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if else
一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行
嵌套if语句
可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。
Switch语句
一个 switch 语句允许测试一个变量等于多个值时的情况
嵌套Switch语句
可以在一个 switch 语句内使用另一个 switch 语句
ps:每个case 语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠); 不要忘记最后那个default 分支。即使程序真的不需要default 处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了default 处理。
位运算
标签:语句,const,struct,0121,int,定义,嵌入式,日志,函数 来源: https://blog.csdn.net/weixin_46086647/article/details/122628312