您的位置:首页 > 编程语言 > C语言/C++

C语言变量类型和存储分配

2012-03-19 22:41 344 查看
程序内存从地地址到高地址一般分为代码段、数据段和堆栈段。代码段用来存放执行代码的一块内存区域,该区域的大小在程序运行前就已经确定,并且内存区域属于只读,其中可能包含一些只读的常数变量如字符串变量等。数据段分为静态存储区[包括初始化数据区和未初始化数据区]和堆,堆可以在运行时可由程序员动态分配,如调用malloc函数分配内存调用free释放内存等,堆在分配内存时时往上增长,大小不固定。堆栈段也称为栈,是程序运行是自动动态分配的地方如局部变量,函数参数等。下面总结下C语言各种变量类型以及存放位置:

1.局部变量:

指在函数内部或者块内部(即一对花括号包含的区域)[以下均称为块]定义的变量,只对块范围内有效。

特点:不同块中可以有同名变量名,代表不同的变量,互不干扰;函数形参也是局部变量。

2.全局变量:

在函数之外定义的变量,从定义处开始到文件结束均有效,当然可以使用extern修饰将其范围扩大到其他文件。

特点:如果局部变量和全局变量同名,那么在局部变量作用范围内外部变量不起作用;在不必要是尽量不要使用全局变量,因为其降低了函数的通用性。

3.在C中变量存储方式分为动态存储和静态存储,变量类型分为四种:自动型(auto,即局部变量)、寄存器型(register修饰的)、静态型(static修饰的)、外部型(extern修饰的,包括本文件的全局变量,因为可以省略extern)。

.自动型和寄存器型就是动态存储方式,即在程序执行到某一时刻被动态的建立然后又被动态的撤销。如自动型局部变量和函数调用时的现场保护和返回地址等都是存放在栈中结束后会自动释放,如果自动局部变量未赋值初值则不确定。寄存器型是在寄存器中,比如一些变量使用频繁为节省时间C允许将值放在寄存器中,由于计算机寄存器有限,所以不能定义太多寄存器变量,不同系统对允许使用的寄存器个数也不同,处理也不同,如MS C,Turbo C将寄存器当自动变量处理。

.静态型和外部型属于静态存储,在程序执行时就分配存储单元直到程序结束才释放。所以static修饰的局部变量每次调用都可以保存其值。它们存储在数据段中得静态数据区。

注:静态全局变量是不能用extern将其引用到其他文件的,它只能在当前文件中有效,作用就是限制该全局变量的作用范围。全局变量和静态局部变量未赋值时自动置为0.

********************顺便总结下C中其他的修饰符*********************

一、const修饰符

1.修饰的变量必须初始化:

const int i=1;//合法

const int j;//非法

2.被修饰的变量只能被读:

const int i=1;

int j=2;

i=j;//非法

j=i;//合法

3.可以避免不必要的内存分配:

#define STR "abcdef"

const char str[]="abcdef";

printf(STR);//为STR第一次分配内存

printf(str);//为str一次分配内存

printf(STR);//为STR第二次分配内存

printf(str);//已经不需要分配内存了

同样是一个常量字符串,宏定义在编译时候自动替换了,所以实际是很多的常量。

4.数值常量和指针常量区分:

int x=1;

const int y=2; //y是常量,初始化之后就不能修改y值了

const int *p1=&x; //p1指向的内容是常量,不可以修改

int * const p2=&x; //指针p2是常量,所指向的内容可修改

const int * const p3=&x;//指针p3和p3指向的内容均不可以修改

p1=&y;//合法

*p2=3;//合法

5.const的常量未必一定不可以修改

const int x=1;

int *p=(int*)&x;

*p=2;

此时的x的值便被修改为2了。

const的作用:

1.给读代码的人传达非常有用的信息。

2.通过给优化器一些附加信息,使用const也许能产生更紧凑的代码。

3.合理的使用const可以使编译器很自然的保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug。

二、volatile

一个为volatile的变量是说这个变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值了。精确的说就是优化器在用到这个变量时必须每次都小心的重新读取这个变量的值而不是使用保存在寄存器里的备份。

用途如:

1.并行设备的硬件寄存器如状态寄存器。

2.一个中断服务子程序中会访问到的非自动变量。

3.多线程应用中被几个任务共享的变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: