1.ststic:
(1).修饰函数,只能在声明他的源文件中使用;在大型项目中,防止不同文件中函数重名时使用。
(2).修饰存储类型使之成为静态存储类型,(修饰后的变量存储在数据段,初值为0)分为两种:
a.修饰全局变量:改变函数作用域,只能在本文件中使用;何时使用:同函数;
b.修饰局部变量:改变生命周期,函数调用结束不再释放,整个程序运行结束释放(局部变量存储在栈空间,static修饰后存储在数据段的静态数据区);何时使用:程序应该尽量少得使用全局变量(安全性),需要时用static修饰局部变量替代;另外在统计时也会使用到;
2.const
(1).修饰只读变量,一般在传参时使用,修饰函数形参,保证变量在函数中不被修改;
(2),const 修饰的是变量名,不是内存空间。故不可通过变量名修改变量的值,但是可以通过地址修改(所以const修饰的变量的说法错误);
(3).例:const int num=5;
a.num++;编译出错;
b. int *p=# mun++; //此时num值被修改为6;
(4).const为就近原则:
const int *p不变 | *p不变,即内容不变,但是p的指向可以变 | 有const int *p=# 则p++;(对) (*p)++;(错) num++;(错) |
int const *p | *p不变 | |
int * const p | p不变,指向不变,但内容(*p)可变 | |
const int *const p | p和*p都不变,内容和指向都不变 |
3.typedef:
(1).给数据类型重命名:
(2).提高程序可移植性,可读性,和开发效率
a.切换平台时,减少不同平台有符号数和无符号数切换带来的问题;减少代码修改量,只需修改typedef语句;
b.隐式表明参数类型:typedef unsigned int Size_t; int func(Size_t a,Size_t b)
4.extern
(1).作外部声明;(不分配内存空间,extern不是语法,是一种规范),优化编译速度
a.函数内部声明:
int func()
{
extern int num;//函数内部声明
}
....
int num; //num为全局变量
//此种情况一般将全局变量放在程序顶部,避免声明
b.在其他文件中声明
(2).声明函数
5.register
(1).修饰变量,将变量尽可能地保存在CPU内部寄存器中;(尽可能:寄存器为稀缺资源,不够使用)
(2).省去CPU从内存中获取数据的时间,提高程序运行效率;
(3).何时使用:循环变量或频繁被访问的变量;
(4).注意点: 不能取地址操作;不能修饰全局变量(相当于私有化寄存器);不能修饰函数;修饰的变量必须为CPU接受的数据类型(有的CPU不支持float型);
6.volatile(与硬件相关)
(1).防止编译器内部将变量自动优化到寄存器中;例:
int i=100;
while(i>0)
{
.....
} //条件永远成立,很多很多次后,编译器默认该值不变,编译自动优化,将值移入寄存器
//带来后果:若之后i的值修改,编译器中值不变,编译出错
extern防止这种优化
(2).一般在裸机时候使用