My_C++_Study_Blog[1]{变量}
// --------------------------------------------------------------------------------------// 名称:C++学习日记第1天
// 出自: 编程中国 http://www.
// 作者: 冰烨
// 时间: 2008-11-6编程论坛首发
// 声明: 尊重作者劳动,转载请保留本段文字
// --------------------------------------------------------------------------------------
关于变量
一.程序的内存结构
*Win32的可执行文件在加载后, 系统将为它建立一个它自己的虚拟内存空间,即进程空间,其容量达4G。这4G的空间划分为了几个区域,对于win98和win2000是不尽相同的。
内存大小的描述单位是字节
* 1.NULL指针分区是NULL指针的地址范围。对这个区域的读写企图都将引发访问违 规。
* 2.DOS/WIN16分区是98中专门用于16位DOS和windows程序运行的空间,所有16位程序将共享这个4M的空间。Win2000中不存在这个分区,16位程序也会拥有自己独立的虚拟地址空间。有的文章中 称win2000中不能运行16位程序,是不确切的。
*3.用户分区是进程的私有领域,Win2000中,程序的可执行代码和其它用户模块均加载在这里,内存映射文件也会加载在这里。Win98中的系统共享DLL和内存映射文件则加载在共享分区中。
* 4.禁止访问分区只有在win2000中有。这个分区是用户分区和内核分区之间的一个隔离带,目的是为了防止用户程序违规访问内核分区。
* 5. MMF分区只有win98中有,所有的内存映射文件和系统共享DLL将加载在这个地址。而2000中则将其加载到用户分区。
* 6. 内核方式分区对用户的程序来说是禁止访问的,操作系统的代码在此。内核对象也驻留在此。
* 对于用户分区,又可以细分成若干区域。 (在此将这部分区域先大致分为4块:对于这个中学者有篇文章,说得比较清楚,还有vfdff,也作了阐述,我也就不再献丑了。仅作补充)
全局/静态区 地址高
代码区
堆区
栈区
地址低
二、变量的定义:
* c++中变量是存储信息的地址。是计算机内存中的一个地址,程序能在该处存储值,也能从该处取出值。也就是说,变量是可读可写的内存单元。
* 这里有一点需要说明一下,在c语言中曾经有寄存器变量,在c++中,用户还可以定义寄存器变量,但是在c++中用户定义的寄存器变量实际上是自动变量。
到现在为止我们应该提出这样的疑问:
1、变量既然是内存中的一个地址,那么变量占多少字节的内存空间呢?
2、变量在内存中的什么位置呢?
* 第一个问题答:变量占用内存空间的大小是由变量前面的数据类型决定的。如: int i; i占用4个字节的内存空间,因为在32位操作系统下,int数据类型是4字节大小,可用函数sizeof(int) 计算出。
如:Char t; t占用1个字节的内存空间。 Sizeof(char) 等于1。
第二个问题答:
变量在内存中的位置,是由操作系统和变量的属性决定的。通常我们可用的内存区域就是用户分区。 为 了说明回答这个问题,我们需要先看一下变量的分类。
三、变量的分类
* 1.自动变量
在默认情况下.在函数的参数以及在函数中声明的变量为自动变量.自动变量可以使用任何已知的表达式来对其初始化如下:自动变量存放在内存中的栈区。
int w;
int a=6;
int y=a*9
* 2.寄存器变量,可以加快运行速度,但是资源有限,在c语言中,最多只能定义两个寄存器变量,目前在c++中,用户已经不能定义寄存器变量,寄存器变量被系统用来存储特殊的变量。 如:this指针,这个是保存在ecx寄存器中。
register int a;
寄存器变量被存储在寄存器中,因此没有地址,所以不能对其使用地址操作符.
int *p=&a / / not allow
寄存器是存在于CPU中,寄存器变量之所以快的原因是,它不需要访问内存。;
*3.静态变量包括,全局变量,静态全局变量,静态局部变量. 如果没有显示初始化,编译器将自动设置为0;此三种变量在整个程序执行期间都将一直存在,他们都存在于全局/静态区。
全局变量:定义在代码块外面的变量。静态局部变量:定义在代码块外面的,并且又static修饰符只能使用常量表达式来初始化静态变量,常量表达式可以是字面常量,const常量,enum常量
,sizeof常量。
int x; // set to 0;
int y=9; // ok
int z=9*sizeof(int)+1; // ok
int w=9*z; // not allow
* 注意: 要是全局变量在其他文件中可用,那么必须使用 extern 修饰符。 全局变量的名称不能相同,即只能定义一个.要使用应该应用extern修饰符。而静态全局变量则可以定义相同的名字,因为它只是文件可见的.即其他文件无法使用此变量.如果定义相同的名字,那么它们具有不同的空间。
* file1
int error;
* file2
int error;// not allow you should use "extern int error;"
* file3
static int error // ok 此时将隐藏全局 error
静态全局变量和静态局部变量的区别仅在于可见性。静态全局变量对文件可用,静态局部变量仅对定义它的函数可用。 后面举例说明。参照example1。静态局部变量与局部变量(自动变量)的区别: 静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
四、变量与常量
* 什么是常量,顾名思义。常量指的是在程序运行过程中数值保持不变的量。常量有两种,一 种是立即数常量,即常数。另一种是指存储在内存单元中数据,也就是说变量如果去掉可写的属性,便成为常量。