extern、volatile、static关键字
- extern 通常在头文件(a.h)定义,由此在其它文件(b.h引入#include “a.h”)可使用前者的变量、函数
- 存储限定符volatile 是易变的、不稳定。声明如操作系统、硬件或者其它线程等因素修改了变量,而每次使用的时候必须从内存中取值,即从该变量的地址直接取值。编译器优化工作的一个假设,在多任务共享变量、中断与任务共享变量时,必须使用volatile,强制读取内存中的值。
- static 存放在静态数据区、静态局部、静态全局。
- 隐藏,静态全局 在本文件可用
- 隔离
- 持久,仅一次初始化为0
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区,前者是需要程序员手动申请和释放,后者由编译器自动分配和释放的。
常量指针、指针常量、指向常量的指针常量
- 常量指针(常指针):const int *p; 本质上是指针,值不可改变,而可以通过改变指向(更改值)
#include <stdio.h> int main() { int num1 = 1, num2 = 2; // 常量指针 const int *p = &num1; printf("%d\r\n", *p); // 1 // 改变指向 p = &num2; printf("%d\r\n", *p); // 2 num2 = 3; printf("%d\r\n", *p); // 3 return 0; }
- 指针常量:int * const p; 本质上是常量,值可以改变,而指向不可改变
#include <stdio.h> int main() { int num1 = 1; // 指针常量 int * const p = &num1; printf("%d\r\n", *p); // 1 // 改变值 num1 = 2; printf("%d\r\n", *p); // 2 *p = 3; printf("%d\r\n", num1); // 3 return 0; }
- 指向常量 的 指针常量,const int * const p,指向和值都不可改变
#include <stdio.h> int main() { int num1 = 1; // 指向常量 的 指针常量 const int * const p = &num1; printf("%d\r\n", *p); // 1 num1 = 2; printf("%d\r\n", *p); // 2 return 0; }
- const int const *p
#include <stdio.h> int main() { int num1 = 1; const int const *p = &num1; printf("%d\r\n", *p); // 1 num1 = 2; printf("%d\r\n", *p); // 2 return 0; }
字符串char[]拼接及十六进制转十进制
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "09";
char str2[] = "A1";
int num = 0;
// "09a1"
strcat(str1,str2);
// 2465
sscanf(str1,"%x",&num);
printf("%d\r\n", num);
return 0;
}
注 atoi()只能针对十进制字符串转整型
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "11"; int num = atoi(str); printf("%d\r\n", num); return 0; }
保留高位0
#include <stdio.h>
int main()
{
int num1 = 0x01;
// 这里低位保留为02,而非2
int num2 = 0x02;
int num3 = (num1 << 8) | num2;
// 102 258
printf("%x %i", num3, num3);
return 0;
}
串口传输float浮点型转换
.h
typedef union _Float_u{
struct
{
unsigned char char_bit_0;
unsigned char char_bit_1;
unsigned char char_bit_2;
unsigned char char_bit_3;
}Float_s;
int integerVal;
float floatVal;
uint8_t u16_to_u8[4];
uint16_t u8_to_u16[2];
}Float_u;
.c
Float_u float_u;
float_u.floatVal = 3.14159;
uint8 buf[4];
buf[0] = float_u.char_bit_0;
buf[1] = float_u.char_bit_1;
buf[2] = float_u.char_bit_2;
buf[3] = float_u.char_bit_3;
// or
buf[0] = float_u.u16_to_u8[0];
buf[1] = float_u.u16_to_u8[1];
buf[2] = float_u.u16_to_u8[2];
buf[3] = float_u.u16_to_u8[3];
// revert
float_u.u16_to_u8[0] = buf[0];
float_u.u16_to_u8[1] = buf[1];
float_u.u16_to_u8[2] = buf[2];
float_u.u16_to_u8[3] = buf[3];
printf("%f", float_u.floatVal);