静态变量、局部变量与全局变量详解

在网上看到一篇对静态变量、局部变量与全局变量的讲解,感觉解释的很清晰~保留后用。

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://zhengyongkun.blog.51cto.com/1163218/1250019

最近重拾C++,学习到这几个概念,涉及到堆栈的调用、分配等等,在这里重新整理下,希与各位互相讨论学习。


静态数据成员在程序中只有一份复制品,由该类型的所有对象共享访问。非静态数据成员则不然,每个类对象都有自己的复制品。


类的静态成员必须初始化。如果静态成员是个类,那么就会调用它的构造函数。


静态成员函数为类的全部服务而不是为某一个类的具体对象服务。静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。


1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
void fun( int i)
{
    static int value=i++;
    printf ( "%d\n" ,value);
}
int main()
{
    fun(0);
    fun(1);
    fun(2);
    return 0;
}


程序输出为

 0

 0

 0


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
void fun( int i)
{
    static int value=i++;
    value=i++;
    printf ( "%d\n" ,value);
}
int main()
{
    fun(0);
    fun(1);
    fun(2);
    return 0;
}


程序输出为

 1

 1

 2


注解:

static变量只初始化一次,具有“记忆”功能,与源程序“同生死,共存亡”。

auto变量存放在栈区,调用结束立刻被销毁。


在头文件中定义静态变量 ,会浪费空间或者引起程序错误。因为若每个C语言文件都使用了该头文件,则在每个头文件中会单独列出一个静态变量。


不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。


全局变量、静态局部变量与静态全局变量都在静态存储区分配空间,而局部变量在栈上分配空间。


全局变量具有全局作用域,静态变量具有稳健作用域。


静态局部变量具有局部作用域,只被初始化一次。静态全局变量具有文件作用域,如果一个程序包含多个文件,只对声明静态全局变量的文件生效。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
static int j;
int k=0;
int m;
void fun1()
{
    static int i=0;
    i++;
    m=i;
}
void fun2()
{
    j=0; //如果没有此行的初始化,j的值最后也会变为10
    j++;
}
int main()
{
    for (k=0;k<10;k++)
    {
       fun1();
       fun2();
    }
    printf ( "%d\n" ,m);
    printf ( "%d\n" ,j);
    return 0;
}


注解:

i为静态局部变量,只被初始化一次。

j是静态全局变量,每次函数调用的时候都被初始化。

全局变量只定义未初始化默认为0;

局部变量只定义未初始化,若是int类型,则默认的是-858993460,即0xcccccccc。


1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int my( const int a)
{
    static int count=a;
    return count + a;
}
int main()
{
    printf ( "%d\n%d\n" ,my(4),my(5));
    return 0;
}


程序输出结果入如下:

  9

  10


注解:

printf函数总是从列表变量的右端开始计算压栈,再从左到右对应弹出栈。


局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。要使用全局变量,需要使用操作法::。


1
2
3
4
5
6
7
8
#include<stdio.h>
int i=1;
int main()
{
    int i=i;
    printf { "%d\n" ,i);
    return 0;
}


程序输出结果:

  -858993460


注解:

main函数里面定义的i会屏蔽掉全局变量i,致使定义的i=它本身,所以会输出一个随机值。



本文出自 “大白菜” 博客,请务必保留此出处http://zhengyongkun.blog.51cto.com/1163218/1250019


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值