static、const关键词作用
在c语言中,static关键词根据出现位置不同,其作用也不完全相同。
在函数中使用时,用于声明一个静态局部变量。静态变量并不随着其所在函数的调用结束被一起销毁,而是保留到下一次调用时继续使用。注意,static修饰的局部变量仍然是一个局部变量,它的作用域仍然还是这个函数内。其默认值为0。
在代码块外,用在一个全局变量或是函数前时,它会改变默认的external属性,使得这个变量或函数有效范围限制在当前文件内;换句话说其他文件不可使用当前变量或函数,哪怕声明了extern也不行。
static int a; int b; //a和b都是全局变量,但a不可以被其他文件调用 void func() { static int c; //c只初始化一次。默认为0 int d; //d每次都要初始化 }
未初始化的全局变量和静态变量储存在bss段,经过初始化的全局和静态变量则储存在data段。在data/bss段储存数据,称为静态内存分配。编译时已经分配好了内存。
--------------------------------------------
const在c语言中主要是将变量变成常量,修饰函数和返回值;在c++中,还能修饰函数定义,定义类的成员函数。被const修饰的变量,其值一般不可更新。
此外,const修饰后,变量默认失去external属性。
总的来说,const代表的就是“只读”属性。按照规则,在多个关键词连续时,const最近的关键词即不能修改项。
1.const修饰一个变量时,只能在初始化时修改值,否则之后就不能再修改
2.const与指针连用时:
const int *p; //const修饰int,*p还是*p,它指向的值不能变 int const *p; //const还是修饰int int *const p //const修饰int *,即*p这个指针本身不可改变 const int* const p // *p和它指向的值都无法改变
3.程序中有时候会意外给不该重新赋值的变量赋值,加入const也可以起到保护作用。
4. 在c++中,const还可能与引用相结合。引用的实现和指针其实类似,作用是给原变量起一个别名,但是在使用时会自动解引用,不用像指针变量一样要加个*标记。
在引用后,名称无法再次改变,并且引用时会开辟一个新空间储存被引用变量的地址。
引用的效果: int a=10; int &b=a; //此处即引用,b和a指向同一变量。改a改b效果一样 注意,这里的&表引用。
与const结合时:
const int a=10; 如果试图int &b=a;会直接报错 但是, const int &b=a;//是正确的 常量就对应常引用 //一个变量能对应常引用 此外,const int &c=10;//正确,系统会临时分配一个变量
5.const在函数中。
1)无论是指针传递还是值传递,const都不能与输出参数相结合,否则参数就会失效。
2)修饰输入参数时,如果输入参数是一个指针,那么const可以防止意外改动指针。如果传进来的是值参数,那加不加const都一样,因为此时使用的是一个临时变量,原变量不会被改变。
但如果是一个引用传递,那加上const是有用的。如void func (const int&a)
3)const在修饰函数返回值时。如果返回的是一个指针,用const修饰以后,对应承接的变量也必须是同类型的const指针
const char* func(void) { } int main() { char* str=func();//错误,str必须是一个char型的const指针 const char* str2=func();//正确 }
4)如果返回值是一个值,那么加不加const都一样,因为函数的返回值会被复制给另一存储单元,加不加const都一样。
6.const修饰成员函数时。任何不修改成员数据的成员函数,都应该被声明为const类型。写在函数形参的末尾。
class stack { public: void Push(int elem); int func()const ; }
在增加了const修饰后,func()这个成员函数,既不可以调用其他非const成员函数,也不可以修改数据成员(哪怕是带有const)。 const对象只能访问其他const对象,但非const对象可以访问const对象。
7.const常量一般被分配在符号表而不是内存空间中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!