目录
一:⼆进制、⼗六进制、位运算
进制
前缀 | 组成 | |
---|---|---|
二进制 | 0b(B) | 0 和 1 两个数字组成 |
八进制 | 0(数字) | 0~7 八个数字组成 |
十进制 | 无前缀 | 0~9 十个数字组成 |
十六进制 | 0x(X) | 数字 0~9、字母 A~F 或 a~f(不区分大小写)组成 |
输出:
注意:
1.标准的C语言并不支持上面的二进制写法
2.部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。
位运算
位运算(&、|、^、~、>>、 | 菜鸟教程 (runoob.com)
位运算符与赋值运算符结合,组成新的复合赋值运算符
二:静态变量以及函数static
C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程 (runoob.com)
修饰变量:static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
修饰全局变量:这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
修饰函数:static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用(利用这一特性,可以在不同文件夹中定义同名变量或者函数,而不必担心命名冲突)
三:Typedef及Typedef结构体
typedef 用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量
的定义。typedef 在MDK 用得最多的就是定义结构体的类型别名和枚举类型了
用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。
用途二:用typedef来定义与平台无关的类型。
用途三:为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。
C/C++结构体typedef用法详解(附c系统学习资料) - 知乎 (zhihu.com)
//如:
typedef struct
{
u16 seq_num;
u16 len;
u8 dev_id[GPRS_PRO_DEVICE_ID];
u16 command_id;
u8 *pro_data;
}gprs_pro_cmd_t;
//然后我们就可以直接使用gprs_pro_cmd_t 定义一个结构体变量。
typedef vs #define
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
- typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
四:结构体指针
- 结构体变量.成员名。
- (*指针变量).成员名。
- 指针变量->成员名。
结构体指针,C语言结构体指针详解 (biancheng.net)
用指针引用结构体变量成员的方式是:
(*指针变量名).成员名
# include <stdio.h>
# include <string.h>
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20]; //姓名
int num; //学号
struct AGE birthday; //生日
float score; //分数
};
int main(void)
{
struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
struct STUDENT *p = NULL; /*定义一个指向struct STUDENT结构体类型的指针变量p*/
p = &student1; /*p指向结构体变量student1的首地址, 即第一个成员的地址*/
strcpy((*p).name, "小明"); //(*p).name等价于student1.name
(*p).birthday.year = 1989;
(*p).birthday.month = 3;
(*p).birthday.day = 29;
(*p).num = 1207041;
(*p).score = 100;
printf("name : %s\n", (*p).name); //(*p).name不能写成p
printf("birthday : %d-%d-%d\n", (*p).birthday.year, (*p).birthday.month, (*p).birthday.day);
printf("num : %d\n", (*p).num);
printf("score : %.1f\n", (*p).score);
return 0;
}
//输出结果
//name : 小明
//birthday : 1989-3-29
//num : 1207041
//score : 100.0
为了使用的方便和直观,用指针引用结构体变量成员的方式:
(*指针变量名).成员名
可以直接用:
指针变量名->成员名
来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高。p->num 的含义是:指针变量 p 所指向的结构体变量中的 num 成员。p->num 最终代表的就是 num 这个成员中的内容。
# include <stdio.h>
# include <string.h>
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20]; //姓名
int num; //学号
struct AGE birthday; /*用struct AGE结构体类型定义结构体变量birthday, 生日*/
float score; //分数
};
int main(void)
{
struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
struct STUDENT *p = NULL; /*定义struct STUDENT结构体类型的指针变量p*/
p = &student1; /*p指向结构体变量student1的首地址, 即第一项的地址*/
strcpy(p->name, "小明");
p->birthday.year = 1989;
p->birthday.month = 3;
p->birthday.day = 29;
p->num = 1207041;
p->score = 100;
printf("name : %s\n", p->name); //p->name不能写成p
printf("birthday : %d-%d-%d\n", p->birthday.year, p->birthday.month, p->birthday.day);
printf("num : %d\n", p->num);
printf("score : %.1f\n", p->score);
return 0;
}
五:其他
const关键字:
不能再次赋值只能使用,保证其定义的值不变
C++ const 关键字小结 | 菜鸟教程 (runoob.com)
共同体:
宏定义、条件编译:
(12条消息) C语言详解(6)宏定义和条件编译_宏定义需要编译吗_「已注销」的博客-CSDN博客
⼤⼩端:
(12条消息) 什么是大小端?如何确定大小端?_wwwlyj123321的博客-CSDN博客
(12条消息) 字节序(大小端)理解_字节大小端_della_Xiang的博客-CSDN博客