您的位置:首页 > 其它

变量的作用域、链接属性和存储类型

2017-02-04 15:46 176 查看

一,变量的作用域

1,代码块作用域。声明位于一对大括号之间,有效范围从声明开始至代码块结束。

2,文件作用域。声明位于所有代码块之外,有效范围从声明开始至文件尾。

3,函数作用域。函数内有效。一般只针对goto语句所用到的标签。

4,原型作用域。只适用于函数声明的括号内。(用到比较少)

例1:

typedef  char  *charPtr;  //文件作用域
charPtr        ch_a;//文件作用域
int            int_a;//文件作用域
int            fun_a(int int_b);//fun_a是文件作用域,int_b是原型作用域
int  main(void)
{
int  int_c = 0;//代码块作用域
{
charPtr   ch_c;  //代码块作用域
int int_d;   //代码块作用域
}
fun_a(100);
return 0;
}
int fun_a(int int_b)     //int_b是代码块作用域
{
goto stop;
stop:                     //函数作用域。
return int_b + 1;
}


二,链接属性

1,无链接。正常的变量,多次不相互冲突的声明被当作不同的变量实体。被存储在不同的位置。

2,内部链接。同一个文件内多次声明的同名变量,指的是同一个实体。位于不同的源文件则指不同的实体。(关键字static)

3,外部链接。同一个program中不管声明几次,在几个源文件中均表示同一个实体。(关键字extern)

例2:

typedef  char  *charPtr;
static charPtr  ch_a;     //static声明将外部链接转为内部链接
extern int      int_a;    //声明int_a在其他文件中定义,表示int_a是外部链接。
int             int_b;    //外部链接,可以在外部源文件中用extern声明。
int             fun_a(int int_c);  //外部链接
int  main(void)
{
int  int_d = 0;     //无链接
{
charPtr   ch_c;  //无链接
int int_e;      //无链接
}
fun_a(100);
extern   int int_f;      //声明int_f在其他文件中定义。
static   int int_g;      //无链接,因为static只对默认为外部链接的变量有效。
return 0;
}
int fun_a(int int_c)
{
return int_c + 1;
}


三,存储类型

1,静态内存。程序运行之前创建,程序运行过程中一直存在。并且始终保持原先的值。(用static修饰)

2,运行时堆栈。程序执行到声明变量的代码时创建,离开代码段时自行销毁。

3,硬件寄存器。(register)提示对应的变量应该放在机器的寄存器当中,而不是内存中。与编译器相关,不一定能够达到效果。

注:由于函数调用是实参是通过堆栈进行传递的,故函数的形参不能声明用static进行修饰。

四,static的作用

1,改变链接属性:将变量由外部链接改为内部链接,拒绝外部源文件使用该变量。如例2中的变量ch_a.

2,改变变量的存储形式。变量存储于静态内存。用于定义静态变量。保证变量在程序运行的过程中一直存在,且只会被定义一次。

注:对于在.h中定义的文件作用域的static变量sa,每一个引用该头文件的源文件都会有一个独立的变量sa。

五,C++中的static

1,类静态成员变量:

静态成员是类所有实例的公用变量,可以理解为类的作用域内的全局变量。同普通的static变量一样,在程序初始化的时候分配一次,在程序运行期间一直存在。

2,类静态成员函数

静态函数是类所有实例的公用函数,只能访问类的静态成员变量,通过类名::函数名方式调用。

3,对于类的静态成员(包括变量和函数)。在类的定义中只是声明,必须在cpp中进行初始化/实现,初始化/实现时不需要static修饰。对于类的静态成员变量程序会在启动前(main()执行前)进行初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐