静态变量,非静态变量

来源:互联网 发布:mac os 10.12 iso下载 编辑:程序博客网 时间:2024/06/05 06:27

静态变量:

静态变量的类型关键字是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。 由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。

注意的是:1.静态变量和全局变量不受生存期的影响;

                  2.静态变量只会初始化一次;

                  3.静态变量的声明与初始化是两个不同的操作;

                  4.静态变量的声明在编译时已经明确了内存的位置。

给读者一个简单直白的例子(区别静态局部变量和动态局部变量):

#include<stdio.h>int fun(int n){    static int f=1;    f=f*n;    return f;}void main(){    int i;    for(i=1;i<=5;i++)    printf("fun(%d)=%d\n",i,fun(i));}
运行结果是:
fun(1)=1fun(2)=2fun(3)=6fun(4)=24fun(5)=120

说明f在加了static的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。而如果不加static的类型限制,那么,会是什么结果呢,我们看下面的代码:

#include<stdio.h>int fun(int n){    int f=1;    f = f * n;    return f;}void main(){    int i;    for(i=1;i<=5;i++)        printf("fun(%d)=%d\n",i,fun(i));}程序的运行结果是:fun(1)=1fun(2)=2fun(3)=3fun(4)=4fun(5)=5

也就是说,这时函数fun中的变量f的生命周期就仅限于fun函数的范围内了,在main中每次传入新的参数i,f就会计算1*i的值并返回,而不会像之前那样不断的累乘了。

静态变量和非静态变量的区别(可见性和生存期):

1.内存分配
静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;
而非静态变量需要被实例化后才会分配内存。
2.生存周期
静态变量生存周期为应用程序的存在周期;
非静态变量的存在周期取决于实例化的类的存在周期。
3.调用方式
静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
4.共享方式
静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
非静态变量是局部变量,不共享的。
5.访问方式
静态成员不能访问非静态成员;
非静态成员可以访问静态成员。

原创粉丝点击