最近将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,而自动时期的变量,由于他们都是存储在栈中,值都是不可预知的。
如果显示的初始化,只能用常量或常量表达式对静态存储时期的变量进行初始化,而自动时期的变量无此限制。
阅读(926) | 评论(0) | 转发(0) |