static做用:“改变生命周期” 或者 “改变做用域”函数
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。spa
1.做用于变量:指针
用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(做用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期)。用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,能够记忆上次的数据,不过因为还是局部变量,于是只能在代码块内部使用(做用域不变)。对象
用static声明外部变量-------外部变量指在全部代码块{}以外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时其做用域很广,整个文件都有效甚至别的文件也能引用它。为了限制某些外部变量的做用域,使其只在本文件中有效,而不能被其余文件引用,能够用static关键字对其做出声明。生命周期
总结:用static声明局部变量,使其变为静态存储方式(静态数据区),做用域不变;用static声明外部变量,其自己就是静态变量,这只会改变其链接方式,使其只在本文件内部有效,而其余文件不可链接或引用该变量。内存
2.做用于函数:作用域
使用static用于函数定义时,对函数的链接方式产生影响,使得函数只在本文件内部有效,对其余文件是不可见的。这样的函数又叫做静态函数。使用静态函数的好处是,不用担忧与其余文件的同名函数产生干扰,另外也是对函数自己的一种保护机制。编译器
若是想要其余文件能够引用本地函数,则要在函数定义时使用关键字extern,表示该函数是外部函数,可供其余文件调用。另外在要引用别的文件中定义的外部函数的文件中,使用extern声明要用的外部函数便可。io
const做用: “只读(readonly)”编译
1.定义常量
(1)const
修饰变量,如下两种定义形式在本质上是同样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的,readonly。
TYPE const ValueName = value;
const TYPE ValueName = value;
(2)将const改成外部链接,做用于扩大至全局,编译时会分配内存,而且能够不进行初始化,仅仅做为声明,编译器认为在程序其余地方进行了定义.
extend const int ValueName = value;
2.指针使用CONST
(1)指针自己是常量不可变
char * const pContent;
const (char*) pContent;
(2)指针所指向的内容是常量不可变
const char *pContent;
char const *pContent;
(3)二者都不可变
const char* const pContent;
(4)还有其中区别方法,沿着*号划一条线:若是const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;若是const位于*的右侧,const就是修饰指针自己,即指针自己是常量。
3.函数中使用CONST
(1)const修饰函数参数
a.传递过来的参数在函数内不能够改变(无心义,由于Var自己就是形参)
void function(const int Var);
b.参数指针所指内容为常量不可变
void function(const char* Var);
c.参数指针自己为常量不可变(也无心义,由于char* Var也是形参)
void function(char* const Var);
d.参数为引用,为了增长效率同时防止修改。修饰引用参数时:
void function(const Class& Var); //引用参数在函数内不能够改变
void function(const TYPE& Var); //引用参数在函数内为常量不可变
这样的一个const引用传递和最普通的函数按值传递的效果是如出一辙的,他禁止对引用
的对象的一切修改,惟一不一样的是按值传递会先创建一个类对象的副本, 而后传递过去,而它直接传递地址,因此这种传递比按值传递更有效.另外只有引用的const传递能够传递一个临时对象,由于临时对象都是const属性, 且是不可见的,他短期存在一个局部域中,因此不能使用指针,只有引用的const传递可以捕捉到这个家伙.
(2)const 修饰函数返回值
const修饰函数返回值其实用的并非不少,它的含义和const修饰普通变量以及指针的含义基本相同。
a.
const int fun1() //这个其实无心义,由于参数返回自己就是赋值。
b.
const int * fun2() //调用时
const int *pValue = fun2(); //咱们能够把fun2()看做成一个变量,即指针内容不可变。
c.
int* const fun3() //调用时
int * const pValue = fun2(); //咱们能够把fun2()看做成一个变量,即指针自己不可变。