关键字 | 位数 | 表示范围 | stdint关键字 | ST关键字 |
char | 8 | -128 ~ 127 | int8_t | s8 |
unsigned char | 8 | 0 ~ 255 | uint8_t | u8 |
short | 16 | -32768 ~ 32767 | int16_t | s16 |
unsigned short | 16 | 0 ~ 65535 | uint16_t | u16 |
int | 32 | -2147483648 ~ 2147483647 | int32_t | s32 |
unsigned int | 32 | 0 ~ 4294967295 | uint32_t | u32 |
long | 32 | -2147483648 ~ 2147483647 | ||
unsigned long | 32 | 0 ~ 4294967295 | ||
long long | 64 | -(2^64)/2 ~ (2^64)/2-1 | int64_t | |
unsigned long long | 64 | 0 ~ (2^64)-1 | uint64_t | |
float | 32 | -3.4e38 ~ 3.4e38 | ||
double | 64 | -1.7e308 ~ 1.7e308 |
重点在于stdint关键字代表的意思。
C语言宏定义
关键字:#define
用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改
定义宏定义:
#define ABC 12345
引用宏定义:
int a = ABC; //等效于int a = 12345;
C语言typedef
关键字:typedef
用途:将一个比较长的变量类型名换个名字,便于使用
定义typedef:
typedef unsigned char uint8_t;
引用typedef:
uint8_t a; //等效于unsigned char a;
C语言结构体
关键字:struct
用途:数据打包,不同类型变量的集合
定义结构体变量:
struct{char x; int y; float z;} StructName;
因为结构体变量类型较长,所以通常用typedef更改变量类型名
引用结构体成员:
StructName.x = 'A';
StructName.y = 66;
StructName.z = 1.23;
或 pStructName->x = 'A'; //pStructName为结构体的地址 pStructName->y = 66;
pStructName->z = 1.23;
C语言枚举
关键字:enum
用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合
定义枚举变量:
enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名
引用枚举成员:
EnumName = FALSE;
EnumName = TRUE;
C语言指针
指针是就是相当于地址,在定义变量的时候,会在内存存放N个空间的字节,N取决于定义的数据类型,例如int 的有4个空间,指针指的是该4空间的第一个地址。
Int a=4;
Int *p;
P=&a; (取a的地址)
*p; (读取a地址的内容)
P++; (地址向下取,在上述的int类型的时候,地址的值会+4)
数组的本质就是指针 int a[]={4,6,11} a就是一个地址,所以不再需要&a。 int *p; (表示的是指针类型,空间大少取决电脑的位数)
a[0]等同于*(a) a[1]等同于*(a+1) 如果a++; 地址会+1,因为数组就是一个整体。
指针的应用
- 传递参数
>使用指针传递大容量的参数,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用。
解释:如果子函数接收的是普通的形参变量,会在内存复制一份一样的,不会影响主函数的数据,但当数据比较大时候会浪费很多内存。使用指针传参直接访问主函数的数据,减少内存的浪费,也可以在指针变量前添加const限定子函数不能修改内容。
使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计。
解释:子函数return不用返回值,因为子函数使用的就是主函数的数据,主函数把需要的改变的值传给子函数,子函数可以修改,最后主函数读出来。就相当于实现了子函数的多个返回值。
- 传递返回值
将模块内的公有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作
解释:不同模块(相当于不同的文件)之间的变量和函数是不能直接使用的,往往需要定义.h文件和extern来调用,但这种会公开使用不利于封装。此时可以用数组指针可以直接使用。
例如:
/******************/
Int Time[]={78,96,55};
Int *GetTime(void)
{
Return Time;
}
/******************/
/**********/
Int main()
{
Int *pt;
pt=GetTime();//调用
{
/************/
这两个函数都存在于不同的模块文件里
- 直接访问物理地址下的数据
访问硬件指定内存下的数据,如设备ID号等将复杂格式的数据转换为字节,方便通信与存储
解释:当某设备的ID号给出地址时,可以 *地址 把设备的ID号读取
本文是跟着江科大学习,这是本人的学习笔记,如有侵权请联系本人删除!