当前位置: 首页 > 科技观察

C语言中Static和Const关键字的作用

时间:2023-03-13 19:28:03 科技观察

程序的局部变量存在于(栈),全局变量存在于(静态区),动态应用数据存在于(堆).1.作用于变量:  使用static声明局部变量--------局部变量是指定义在代码块{}内部的变量,只在代码块(作用域)内部有效,它们默认storage方法是自动变量或动态存储,即当指令执行到变量定义时,存储单元被分配给变量,当代码块跳出时,内存单元(lifetime)被释放。当用static声明一个局部变量时,改变了变量的存储方式(生命周期),使该变量成为静态局部变量,即在编译时为该变量分配内存,直到调用结束时才释放存储单元。程序退出。这样局部变量就有了记忆功能,可以记住上一次的数据,但是因为还是局部变量,所以只能在代码块内部使用(作用域不变)。  使用static声明外部变量------外部变量是指定义在所有代码块{}之外的变量,默认为静态变量,编译时分配内存,程序结束时释放内存单元。同时,它的范围很广,整个文件都是有效的,甚至其他文件都可以引用。为了限制一些外部变量的作用域,使其只在本文件中有效,不能被其他文件引用,可以用static关键字声明。  总结:使用static声明局部变量,使其成为静态存储方式(静态数据区),作用域不变;仅在本文件内部有效,其他文件不能链接或引用该变量。2、作用于函数:当  使用static进行函数定义时,会影响函数的连接方式,使函数只在本文件内部有效,对其他文件不可见。此类函数也称为静态函数。使用静态函数的好处是不用担心会干扰其他文件中的同名函数,同时也是对函数本身的一种保护机制。  如果想让其他文件引用本地函数,定义函数时必须使用关键字extern,表示该函数是外部函数,可以被其他文件调用。另外,在一个文件中需要引用另一个文件中定义的外部函数时,使用extern声明要使用的外部函数。const:"readonly"的作用1.定义常量(1)const修饰变量,下面两种定义形式本质上是一样的。其含义是:const修饰的TYPE类型的变量值是不可变的,只读的。TYPEconstValueName=值;constTYPEValueName=值;(2)将const改成externalconnection,用于扩展到整个世界,编译时会分配内存,不能初始化,只是作为一个语句,编译器认为它定义在程序的其他地方。extendconstintValueName=值;2.指针使用CONST(1)指针本身是常量和不可变的char*constpContent;const(char*)pContent;(3)两者都是不可变的constchar*constpContent;(4)还有一种区分方式,沿着*号画一条线:如果const在*的左边,那么const用来修饰指针指向的变量,即指针指向一个常量;如果const在*的右边,const就是修饰指针本身,即指针本身是常量。3、在函数a中用CONST(1)const修改函数参数。传入的参数在函数中不能改变(无意义,因为Var本身就是形参)voidfunction(constintVar);b.参数指针指向的内容是一个常量Immutablevoidfunction(constchar*Var);C。参数指针本身是常量和不可变的(也是无意义的,因为char*Var也是形参)voidfunction(char*constVar);d.该参数是一个参考,以提高效率和防止修改。修改引用参数时:voidfunction(constClass&Var);//引用参数在函数内部不可改变passingbyvalue效果是一模一样的,他禁止对引用对象的所有修改,不同的是passbyvalue会先创建类对象的副本,然后再传过去,而且是直接传地址,所以这种传递比按值传递更有效。另外,只有引用传递的const才能传递临时对象,因为临时对象都是const属性,是不可见的。它们存在于局部域的时间很短,所以不能用指针,只能通过引用传递const才能抓到这家伙。(2)const修饰函数的返回值实用性不高。其含义与const修饰的普通变量和指针基本相同。a.constintfun1()//这个其实是没有意义的,因为参数return本身就是一个赋值。b.constint*fun2()//调用时Constint*pValue=fun2();//我们可以把fun2()看成一个变量,即指针的内容是不可变的。c.int*constfun3()//当调用int*constpValue=fun2();//我们可以把fun2()看成一个变量,即指针本身是不可变的。