static (存储在程序静态区)
1.未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);☆
2.静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;☆☆
3.定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:☆☆
1).静态全局变量不能被其它文件所用;
2).其它文件中可以定义相同名字的变量,不会发生冲突;
4.static 定义的函数:只有在该文件有作用,其他文件不起作用(用extern);
static定义局部变量:局部变量存储在栈中。
int example(){int a=0;a++;} 调用example()都返回1;
int example(){static int a=0;a++;} 调用example()返回 调用次数(a++);
Register(存储在寄存器)
1.Register只是请求寄存器变量,不一定成功;☆☆
2.Register变量必须是运行的CPU寄存器可以接受的值;☆
3.不能用&获取register变量地址;☆
4.Register不能修饰全局变量,应该修饰局部变量(实时性高,使用频繁高,建议使用)。☆☆
Auto()(存储在栈)
1.局部变量默认为auto
if语句
1.变量与0比较时,0放在等号的左边
If(0 == i)
2.float 不能与0直接比较
#define E 0.0000001
....
float a = 5.0;
if((5 - E <= a) && (a <= 5 + E))
{....}
switch语句
1.switch(ch)
{
case a: .....;
case b: .....;
case c: .....;break;
default : ......;break;
}
2.使用情况 ☆☆
1)当判定条件为范围时,用if较好;
2)当判定条件为具体的值时(a,b,c,1,2,3),用switch较好。
3.do,while,for语句
do:必执行一次循环;
while(a): a=0不执行; a!=0执行;
4.break与continue区别
break:终止循环执行;(跳出当前块----就是{..})
continue:终止本次循环;
5.do while 使用技巧(do while 是一个块(入口---块----出口) 程序可以确定一个入口和出口)☆☆
int fuc(int n)
{ int i = 0; int ret =0; int *p= (int *)malloc(sizeof(int)*n);
do { If( NULL == p) break; If(n<0)break;
for(i=0;i<n;i++) {p[i]=i;}
}while(0);
free(p); return ret;
}
6.void
不存在void类型,但存在void*(接收任何类型的指针)。
7.extern
extern: 1)声明外部定义的变量 和函数 2)告诉编译器用标准“C”编译
8.sizeof
sizeof 不是函数 是编译器的内置指示符 或者 关键字;
int a; printf(“%d\n”,sizeof(a));
9.const
1.const修饰的变量是只读的,占用内存空间(可以通过指针对其改变);
2.const 修饰的数组是不可以改变的
3.const 修饰函数---->函数的返回值不可改变(但是可以通过改变函数返回的地址改变数据)
口诀:左数右指
const int* p //p指向的数据不可改变(*p),p指向的地址可改变
int const* p //p指向的数据不可改变(*p),p指向的地址可改变
int* const p //p指向的数据可改变(*p),p指向的地址不可改变
const int* const p //p指向的数据不可改变(*p),p指向的地址不可改变
1)指针指向的变量的值不能变,指向可变
int x = 1;
int y = 2;
const int* px = &x;
int const* px = &x; //这两句表达式一样效果
px = &y; //正确,允许改变指向
*px = 3; //错误,不允许改变指针指向的变量的值
2)指针指向的变量的值可以改变,指向不可变
int x = 1;
int y = 2;
int* const px = &x;
px = &y; //错误,不允许改变指针指向
*px = 3; //正确,允许改变指针指向的变量的值
3)指针指向的变量的值不可变,指向不可变
int x = 1;
int y = 2;
const int* const px = &x;
int const* const px = &x;
px = &y; //错误,不允许改变指针指向
*px = 3; //错误,不允许改变指针指向的变量的值
10.volatile
1)告诉编译器每次取值要去内存中;
2)主要修饰那些被多线程访问的变量;
3)因未知因素改便的变量;
11.柔性数组
typedef struct _soft_arry {int len; int arry[];}soft_arry;
int main()
{
int i=0;
soft_arry* sa = (soft_arry)malloc(sizeof(soft_arry) + sizeof(int) * 10);
sa->len = 10;
for(i = 0;i<sa->len;i++)
{
sa->arry[i] = i+1;
}
free(sa); return 0; }
12.union和struct区别
union分配最大类型空间,struct分配每个域相加的空间;
struct A{int a; int b;int c;}--->sizeof() === 12
union B{int a; int b;int c;}--->sizeof() === 4
13.enum
自定义类型; 默认常量是前面值加1(0,1,2,3,4...);
enum变量取值范围为定义的离散值
enum color{ GREEN, RED, BULE}; enum color c = RED;
14.Typedef
Typedef用于已经存在的数据类型重命名; typedef重定义的类型不能进行unsigned修饰