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

一,变量的作用域

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值