常量
常量样子同变量的样子相同,但是不能够修改他的值
const int a = 15;
int const a = 15; =>a是指向整形常量,值是15
int * pi; =>指向整形的指针
int const *pi; =>指针的指向可以改变,指向的值不能改变
int * const pi; =>指针的指向不可改变
int const *const cpci; =>都不可以改变
声明const是很有必要的,如果你意外的修改了本来是不应该被修改的值,编译器会报错提示
作用域
作用域类型:
- 文件作用域
- 函数作用域
- 代码块作用域
代码块作用域:
位于一对花括号之间的语句成为一个代码块,在代码块的开始位置声明的标识符都具有 代码块作用域
他们可以被代码块中的所有语句访问
文件作用域
在所有的代码块之外声明的都是具有 文件作用域,从标识符号的声明到源文件的结尾都是可以访问的
也就是声明的全局变量
int a, b = 5;
int c(int x){}
int fun(int e)
{
.....
}
//上面的a,b,c都属于这一类,因为它们没有被代码块包起来
原型作用域
就是函数参数
int fun(int a) //参数a可以命名为任意的名字,仅仅作用域这个函数的开始到结尾
{
...
}
链接属性
链接属性一共有三种:external(外部) internal(内部) none(无)
- none:总是被当做是单独的个体,该标识符的多个声明都是不同的实体
- internal属性的标识符在同一个源文件内所有声明都是一个实体,但是在不同的源文件的多个声明属于不同的实体
- 属于external链接属性的标识符无论声明多少次、位于几个源文件都是同一个实体
关键字:extern 和static
-
如果某个声明具有external链接属性,在前面加上static可以使链接属性变为internal
static int b
表示b为该源文件私有(假设b之前缺省为external),在其他的源文件中如果也链接到一个叫做b的变量那么所引用的就是另一个不同的变量同样对函数名也有效
static int c(int d)
设置为static之后可以防止被其他的源文件调用
-
使用external声明表示符号可将链接属性更改为external,例如下面的k,但是如果用于标识符的第二次或者以后的声明,不会更改第一次指定的类型如i
static int i
int func()
{
int j;
extern int k; =>更改为external链接属性
extern int i; =>第二次更改,不会改变属性
}
总结
- 具有external 链接属性的实体成为全局(global)实体,所有的源文件中所有的函数均可以访问。只要变量 不是声明与代码块内部或者函数定义内部,缺省情况下就是external
- 如果一个变量声明于代码块的内部,在前面加上extern关键字代表它所引用的是 全局变量而不是局部变量