1.数据类型:固定内存大小的别名,创建变量的模子。
例:char:1byte的别名;short:2byte的别名;int:4byte的别名
2.变量:一段实际联系存储空间的别名。程序中通过变量来申请并命名存储空间。通过变量名可以使用存储空间。
3.typedef:自定义数据类型。不是创造新的数据类型,只是给现有的数据类型重新命名。
例:typedef int INT32;//sizeof(INT32)= sizeof(int)=4
typedef unsigned char BYTE;//sizeof(BYTE)=sizeof(unsigned char)=1;
typedef struct _demo
{
short s; //2
BYTE b1; //1
INT32 I; //4
}DEMO;//sizeof(DEMO)=7
4.属性关键字(auto static register)指明变量特有意义。
auto: c语言中局部变量默认属性,在栈上分配空间。
static :变量的静态属性,只被初始化一次
同时具有“作用域限定符”的意义
修饰的局部变量存储在程序的静态区
另一意义为文件作用域标示符
修饰的全局变量/函数作用域只在声明文件中
register: 将变量存储于CPU寄存器
只是请求寄存器变量,但不一定请求成功
Register变量必须是CPU寄存器可以接受的值
不能用&运算符求register变量地址
寄存器变量用于讲究性能,对实时性要求高的实时系统中
5.if
① bool型变量出现在条件中,不要进行比较
例:bool b=TURE;
If(!b){……}【√】
If(b){……}【√】
If(b == 1){……}【×】
② 普通变量与0/常数比较时,0值/常数应出现在比较符号左边
例:if( 0 == x) 【可以避免if(0=x)的错误】
③ float 型变量不能直接进行0值比较,需要定义精度
例:#defineEPSI 0.000001
Float f= 0.0,f1=5.0;
If((-EPSI<=f)&&(f<=EPSI)){……}//替代if (0==f)
If((5-EPSI<=f1)&&(5+EPSI>=f1))//替代if(5.0==f1)
6.switch
① case 语句中的值只能是整形或字符型
② case排序 :按字母、数字顺序排序
正情况在前、异常情况在后
Default必须有,用于异常情况或默认
③if 可以替代switch , switch无法替代if
7.break:终止循环,用于跳出块
Continue:终止本次循环,进下次循环,用于跳出循环
Switch不能用continue 关键字,因为switch 本身没有循环
8.do{}while();的妙用:
do
{
if(……) break;
if(……) break;
……
}while(0);
9.goto:应禁用 ,程序质量与goto出现次数成反比
10.void*指针:作为左值用于“接收”任意类型指针
作为右值赋值给其他指针需强制类型转换
例:实现memset的功能
void* my_memset(void* p,char v,int size)
{
void* ret=p;
char dest= (char*)p;
int i =0;
for(i=0;i<size;i++)
{
dest[i]=v;
}
return ret;
}
int main()
{
inta[5]={1,2,3,4,5};
long l=1000;
int i=0;
my_memset(a,0,sizeof(a));//a[5]={0,0,0,0,0}
my_memset(&l,0,sizeof(l));//l=0
return 0;
}
11.extern: 声明外部定义的变量的函数
用于“告诉”编译器c的方式编译
例:extern “C”
{…...}
12.sizeof :编译器内置指示符,不是函数
用于计算相应实体所占用内存大小
Sizeof的值在编译器就已经确定
例:int a;
sizeof(a);【√】
sizeof a;【√】
sizeof(int);【√】
sizeof int;【×】
13.const:常变量
修饰的变量是只读的,本质还是变量
会占用内存空间
可以通过指针来改变值
例:const intc=1;
Int *p = (int*)&c;
*p = 3;
Const 修饰的数值空间不可改变。
14.const 指针
const int*p;/int const*p;//p可变,p指向的内容不可改变
int const*p;//p不可变,p指向的内容可变
const int*const p;//p和p指向的内容不可变
总结:左数右指
当const 出现在*号左边时指向的数据为常量
当const 出现在*号右边时指针本身为常量
15.volatile 编译器警告指示字
用于告诉编译器必须每次去内存中取变量值
主要修饰可能被多个线程访问的变量
也可修饰可能被未知因素更改的变量
16.柔性数组:大小待定的数组
C语言结构体的最后一个元素可以是大小未知的数组 ,用结构体产生柔性数组
Typedef struct _soft_array
{
Intlen;
Intarray[];
}softArray;
17.struct与union
Struct中的每个域在内存中独立分配空间
Union只分配最大空间,所有域共享这个空间
例:struct c union c
{ {
Inta; int a;
Intb; int b;
}//sizeof(c):8byte }//sizeof(c):4byte
18.enum:枚举
定义常量
默认常量在前一个值基础上依次加1
变量只能取定义时的离散值
枚举与#define区别
①#define宏常量只是简单的进行值得替换,枚举常量是真正意义上的常量
②#define宏常量无法被调试,枚举常量可以
③#define宏常量无类型信息,枚举常量是一种特定类型常量
19.typedef 用于给一个已经存在的数据类型命名
并没有定义新额类型
Typedef重定义的类型不能进行unsigned和signed扩展
Typedef与#define区别
Typedef是给已有的数据类型取别名
#define为简单的字符串替换,无别名的概念