Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108017
  • 博文数量: 23
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-18 19:47
文章分类

全部博文(23)

文章存档

2012年(1)

2011年(6)

2010年(3)

2009年(13)

我的朋友

分类: C/C++

2009-07-08 10:39:12

   最近将C语言的存储类复习了一遍, 因为这两天写的与其相关的程序老是看了不顺眼, 先贴上一段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// main.c
int g_xx = 1; // 作用域: 文件; 链接类型: 外部; 存储时期: 静态
static int s_xx = 2; // 作用域: 文件; 链接类型: 内部; 存储时期: 静态
void func1();
void test()
{
    extern int g_xx;
    int a_xx = 3; // 作用域: 文件; 链接类型: 内部; 存储时期: 静态
    register int r_xx = 5; // 作用域: 文件; 链接类型: 内部; 存储时期: 静态
    static int as_xx = 4; // 作用域: 文件; 链接类型: 内部; 存储时期: 静态
    printf("test, g_xx: %d\n", g_xx++);
    printf("test, s_xx: %d\n", s_xx++);
    printf("test, a_xx: %d\n", a_xx++);
    printf("test, r_xx: %d\n", r_xx++);
    printf("test, as_xx: %d\n", as_xx++);
}
int main()
{
    test();
    test();
    return 0;
}

// func.c
void func1()
{
    extern int g_xx;
    printf("func1, g_xx: %d\n", g_xx++);
}


理清概念:
先复习一下概念, 每种变量都有3中属性: 作用域, 链接类型, 存储时期。 按这种属性进行划分, C语言中
共有5中存储类:自动变量, 寄存器变量, 具有外部链接的静态变量, 具有内部链接的静态变量,无连接静态变量。如代码中注释所示:
g_xx: 具有外部链接的静态变量也就是我们平常所说的全局变量,具有全文件作用域,具有静态存储时期,程序结束之前,他都是存在的。由于具有外部链接属性,你可以在本文件或其他文件的任何地方使用,当然在使用之前,最好以extern进行引用声明增加可读性(在其他文件中引用时,这是必须的,否则编译器会报警),就像test(),func1()函数所示。
s_xx
与g_xx唯一不同的是,具有内部链接属性,你不能在其他文件中进行引用。
a_xx/r_xx两者具有相同的属性,具有代码块作用域,具有自动存储时期,代码块结束,该变量也就消失了。由于空连接属性,因此你只能在代码块之内使用。r_xx与a_xx不同的是,该变量是存储在cpu寄存器中,因此无法通过地址符&对其进行引用。
as_xx与a_xx唯一不同的是,具有静态存储时期,程序结束之前,他都是存在的。

定义覆盖:
这个只跟作用域相关,在同一作用域不能有同名变量;在不同作用域内可以具有同名变量,比如,在
test中定义一个g_xx的局部变量,当然如果这样做,在此作用域内对g_xx的应用都将作用到此局部变量上,而非外部定义的静态变量。

变量初始化:
只跟存储时期属性相关,如果不显示的初始化,具有静态存储时期的变量,其所占内存都将被填充0,而自动时期的变量,由于他们都是存储在栈中,值都是不可预知的。
如果显示的初始化,只能用常量或常量表达式对静态存储时期的变量进行初始化,而自动时期的变量无此限制。

阅读(882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~