C语⾔中Static和Const关键字的的作⽤
static作⽤:“改变⽣命周期” 或者 “改变作⽤域”
  程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
1.作⽤于变量:
  ⽤static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作⽤域),其缺省的存储⽅式是⾃动变量或说是动态存储的,即指令执⾏到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(⽣命期)。⽤static声明局部变量时,则改变变量的存储⽅式(⽣命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因⽽只能在代码块内部使⽤(作⽤域不变)。
  ⽤static声明外部变量-------外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时其作⽤域很⼴,整个⽂件都有效甚⾄别的⽂件也能引⽤它。为了限制某些外部变量的作⽤域,使其只在本⽂件中有效,⽽不能被其他⽂件引⽤,可以⽤static关键字对其作出声明。
  总结:⽤static声明局部变量,使其变为静态存储⽅式(静态数据区),作⽤域不变;⽤static声明外部变量,其本⾝就是静态变量,这只会改变其连接⽅式,使其只在本⽂件内部有效,⽽其他⽂件不可连接或引⽤该变量。
2.作⽤于函数:
  使⽤static⽤于函数定义时,对函数的连接⽅式产⽣影响,使得函数只在本⽂件内部有效,对其他⽂件是不可见的。这样的函数⼜叫
作静态函数。使⽤静态函数的好处是,不⽤担⼼与其他⽂件的同名函数产⽣⼲扰,另外也是对函数本⾝的⼀种保护机制。
  如果想要其他⽂件可以引⽤本地函数,则要在函数定义时使⽤关键字extern,表⽰该函数是外部函数,可供其他⽂件调⽤。另外在要引⽤别的⽂件中定义的外部函数的⽂件中,使⽤extern声明要⽤的外部函数即可。
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);
const的作用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()看作成⼀个变量,即指针本⾝不可变。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。