static关键字
类型名称 | 作用域 | 生命周期 | 默认初始值 |
---|---|---|---|
全局变量 | 当前文件和其他文件(extern) | 整个程序 | 0 |
局部变量 | 当前函数 | 整个定义的函数 | 乱数 |
static 全局变量 | 当前文件(其他文件extern也不可以) | 整个程序 | 0 |
static 局部变量 | 当前函数 | 整个程序 | 0 |
static 函数 | 当前文件(其他文件不可调用) | 整个程序 |
!:
1)总结起来说,static关键字主要用于三个方面(局部变量,全局变量,函数),每个方面的影响主要是两个地方(作用域,生命周期)
①修饰局部变量:普通局部变量的作用域是定义它的当前函数内,声明周期是定义它的整个函数,经过static关键字修饰,对他的作用域没有影响,但是会扩大他的生命周期,变为整个程序。
②修饰全局变量:普通全局变量的作用域是当前文件和其他文件(使用extern声明),声明周期是整个程序,经过static关键字修饰,对他的生命周期没有影响,但是作用域变为当前文件,即成了本文件的私有全局变量,其它文件不可使用,但是可以定义同名变量。
③修饰函数:普通函数的作用域是当前文件和其他文件(不用extern也可以),生命周期是整个程序,经过static关键字修饰,对他的生命周期没有影响,但是作用域变为当前文件,即成了本文件的私有函数,其他文件不可使用,但是可以定义同名函数。
2)默认情况下全局变量和函数的链接属性是external型(对所有文件都有效)的,不论声明多少次,位于几个文件,都是同一个实体。因为函数默认是被extern修饰的,所以使用函数时不需要使用extern关键字声明,但是使用全局变量需要使用extern声明。
3)实质上讲,static改变的是函数和全局变量的链接属性,由external变为internal。
4)因为static修饰的局部变量的生命周期是被定义到程序结束,也就是说,在被定以后,它会一致存在,所以静态局部变量的初始化语句只会在第一次定义时执行一次。
const关键字
1.不涉及指针使用的const关键字,写在哪里效果都是一样的
int const a=1;
const int a=1;
2.
int b=10;
[1] const int* a=&b;
[2] int const* a=&b;
[3] int *const a=&;
[4] const int * const a=&b;
[1],[2]两种写法意义相同,const都是修饰指针所指向的内容,即所指向的内容为常量,不能" *a = 3"。
[3]写法,const修饰的指针本身,即指针本身是一个常量,不能"a++"这样的操作,a不能改变
[4]写法,const修饰的是指针本身和指针所指向的内容,即两者均是常量,都不能改变
注:如何判断const修饰的事物,可以根据const 和 * 的位置,const在前即修饰 "*a",即*a是常量,就是所指向的东西是常量,const在后,即修饰的a本身,a原本是个指针变量,所以a被const修饰以后,a就成了常量,所以a不能变。