C语言之变量类型和存储方式

变量可以分为全局变量、静态全局变量、局部变量和静态局部变量

变量的声明有两种情况:

1、一种是需要建立存储空间的(定义性声明)。例如int a 在生命的时候就已经建立了存储空间。

2、另一种是不需要建立存储空间的(引用性声明)。例如extern int a 其中变量a是在别的文件中定义的。

内存区域的划分:

1、栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值、局部变量等。

2、堆区:程序员向系统申请或释放。

3、全局区:用来保存全局变量和静态变量。

4、文字常量区:用来保存常量字符串的内存区域。

5、程序代码区:用来保存函数体的二进制代码。

先看一个例子:

fileOne.h头文件如下:

#ifndef DMTestVariable_fileOne_h

#define DMTestVariable_fileOne_h

// 声明全局变量

extern int globalVariable;

void addOne();

void testStaticGlobal();

#endif


fileOne.c文件如下

#include <stdio.h>

#include "fileOne.h"

// 静态全局变量

static int staticGlobalVariable = 12;

void addOne()

{

// 全局变量加1

globalVariable += 1;

}

void testStaticGlobal()

{

// 静态全局变量加1

staticGlobalVariable += 1;

printf("静态全局变量:%d\n",staticGlobalVariable);

}


main.c文件如下:

#include <stdio.h>

#include "fileOne.h"

// 定义性声明全局变量

int globalVariable = 10;

void test()

{

// 静态局部变量

static int staticLocalVariable = 20;

staticLocalVariable += 1;

printf("静态局部变量值:%d\n",staticLocalVariable);

}

int main(int argc, const char * argv[])

{

// 局部变量测试

int localVariable = 15;

printf("局部变量%d\n",localVariable);

// 全局变量测试

addOne();

printf("全局变量:%d\n",globalVariable);

// 静态局部变量的测试

for (int i = 0 ; i < 2; i++) {

test();

}

// 静态全局变量

for (int i = 0 ; i < 2; i++) {

testStaticGlobal();

}

return 0;

}


输出结果如下:

C语言之变量类型和存储方式

总结如下:

全局变量,具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件,当然其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量,如代码中的

// 定义性声明全局变量

int globalVariable = 10;


全局变量,定义在main.c源文件中,在fileOne.c源文件中使用时有以下代码再次声明

// 声明全局变量

extern int globalVariable;

静态全局变量,只能在其所在文件模块中的函数中使用,其他文件模块中的函数不能访问。如代码中的

// 静态全局变量

static int staticGlobalVariable = 12;


只能在fileOne.c源文件中使用,不能在main.c源文件中使用。

局部变量:只能在定义该变量的函数体内使用。如代码中的

// 局部变量测试

int localVariable = 15;

只能在main函数中使用。

静态局部变量:在函数内定义,但当函数退出后,静态局部变量始终存在,其占用的内存单元不会被释放,直到程序结束时才被释放。退出函数后尽管该静态局部变量还存在,但是不能使用它,如果再次调用定义该静态局部变量的函数,它又可以继续使用,而且保存了上次调用之后留下的值。如代码中的

// 静态局部变量

static int staticLocalVariable = 20;


第一次调用test()函数输出的此静态局部变量值为21,第二次调用函数test()输出的此静态局部变量值为22。

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

将C语言梳理一下,分布在以下10个章节中:

Linux-C成长之路(一):Linux下C编程概要

Linux-C成长之路(二):基本数据类型

Linux-C成长之路(三):基本IO函数操作

Linux-C成长之路(四):运算符

Linux-C成长之路(五):控制流

Linux-C成长之路(六):函数要义

Linux-C成长之路(七):数组与指针

Linux-C成长之路(八):存储类,动态内存

Linux-C成长之路(九):复合数据类型

Linux-C成长之路(十):其他高级议题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8c8e7602f7dad8596d688abdd7a6b31f.html