C语言const和static关键的区别

static作用:“改变生命周期” 或者 “改变作用域”

注意:由static申明的变量的大小是可以随意改变的
  程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
1.作用于变量:
   用static声明局部变量:局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域)。用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)。
   static申明的变量使其生命周期变成了整个程序,但是没有改变他的作用域,仍然是在程序内部有效。
   用static声明全局变量:外部变量指在所有代码块{}之外定义的变量,为了限制某些外部变量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static关键字对其作出声明。
  总结:用static声明局部变量,使其变为静态存储方式(静态数据区),作用域不变;用static声明全局变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。
2.作用于函数:
  使用static用于函数定义时,对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

const作用: “只读(readonly)”

由const和static定义的变量它的生存周期都是程序运行的整个过程。const申明的局部变量的生存周期也是整个程序,这个只能说明const给变量赋予了静态特性,而不是讲该变量变成了静态变量(static申明或者全局变量)。由const申明的变量(const int a=5;)它的大小在初始化以后就不能在被改变了,而且由const申明的变量的作用域仍然没有被改变。
但是由static申明的变量就不一样,static申明的变量的大小是可以随便变化的,但是如static申明的全局变量和修饰函数的时候,他们的作用域只是在本文件内可以被使用,不能用extern在其他的文件下引用本文件一下的全局变量,同时本文件下的函数也不能在其他的文件下本调用,这样就避免了在多个文件下发生函数名相同而报错的问题。
const和static的相同点:

  1. 生存周期都是程序运行的整个过程

const和static的不同点:

  1. static申明的变量可以随便改变它的大小,但是const申明的变量在初始化以后就不能再改变。
  2. static申明的变量放在静态存储区(静态变量),而const申明的变量放在了“只读数据段”。
  3. static申明的全局变量和函数只在当前文件下有效,不能在其他的文件下被引用,const定义的全局变量可以在其他的文件下引用。

猜你喜欢

转载自blog.csdn.net/qq_39654819/article/details/87904041