首页 > 学院 > 开发设计 > 正文

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

2019-11-14 10:28:21
字体:
来源:转载
供稿:网友

一,变量的作用域

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()执行前)进行初始化。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表