1、const限定符
const限定变量的值不可变,并且const对象必须要初始化
const int buf = 512; //正确,表明buf的值为512
buf = 400; //错误,buf的值不可变
const int temp; //错误,必须要初始化
2、引用
引用必须要初始化,且初始化为对象,类型一致,引用只是给已经存在的对象取另一个名字,不是对象,没有实际地址
int m = 5;
int &k = m;
此时k和m是绑定的,如果k值改变,m值也会改变;
不合法的引用:
int &k = 9; //错误,引用类型的初始值必须为一个对象,不能是一个数值
double m= 0.0;
int &k = m; //错误,类型不一致
3、引用和指针
用和指针都是实现对其他对象 的间接访问,但存在不同点:
第一,指针本身就是一个对象,可以对指针赋值和拷贝,可以指向几个不同的对象
第二,指针无需在定义的时候赋初值
4、指针和const
分不清的时候依靠从右向左阅读
const int *p1 = 45;//说明*p1是一个const型,也就是说p1所指的值不变,但指针可以变
*p1 = 41; //错误,此时p1所指的对象值不变,所以不能给其赋值
int *const p2;//说明p2是一个const,也就是指针不变,但所指的对象值可变
*p2 = 42; //正确
5、关于static
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
6、静态变量、全局变量、局部变量
1、静态全局变量只作用于定义它的文件中,不能用到其他文件,也即被static修饰的变量具有文件作用域
2、全局变量、静态全局变量以及静态局部变量都会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值
3、把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围
tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。