ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

0121嵌入式C学习日志

2022-01-21 21:29:59  阅读:108  来源: 互联网

标签:语句 const struct 0121 int 定义 嵌入式 日志 函数


关键字

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有