C/C++ 的变量

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

全局和静态变量都在堆 里。( 错了,全局变量和静态变量都在数据段,有些地方也叫静态存储区)

全局变量的作用范围是整 个程序(如果程序是多个文件,必须在其他的文件中说明)。

静态变量的作用范围要看 静态变量的位置,如果在函数里,则作用范围就是这个函数。

静 态全局变量,只有本文件可以用。

全局变量是没有定义存储 类型的外部变量, 其作用域是从定义点到程序结束. 省 略了存储类型符, 系统将默认为是自动型.

静态全局变量是定义存储 类型为静态型的外部变量, 其作用域是从定义点到程序结束, 所 不同的是存储类型决定了存储地点, 静态型变 量是存放在内存的数据区中的, 它们在程序开始运行前就分配了固定的字节, 在程序运行过程中被分配的字节大小是不改变的. 只有程 序运行结束后, 才释放所占用的内存.

自动型变量存放在堆栈区 中. 堆栈区也是内存中一部分, 该部分内存在 程序运行中是重复使用的.

按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。

按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有 效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。

全 局变量和静态变量如果没有手工初始化,则由编译器初始化为0 。局部变量的值不可知。

int a;  /* 全局*/
static int b;  /*
静态全局*/

int main()
{
}

这段代码如果是写在file.c 里面的,那么file2.c 就不能调用b;
但是file2.c 中可以通过声明外部变 量extent a;
从而调用a

 

 

原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?boardid=56&id=170039

*/ --------------------------------------------------------------------------------------
*/
出自: 编程中国  http://www.bc-cn.net
*/
作者: 中学者       
*/
时间: 2007-9-14   编 程论坛首发
*/
声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


   
变量和内存的问题,原来是自己理解,通过写小代码来验证,但是总感觉有什么地方不对,使我很混乱,所以 今天就在网上看了一些文章,然后重新认识了这个问题。下面算是我的认识,如果有不对的地方,请指出,多多交流................ 我是新手!!!

   
C++ 中内存的分配:
    1.
栈:是用来存放像一般变量和函数参数等的一块内存。系统会在变 量生存期结束时自动释放内存,即把内存从栈中弹出。 
    2.
堆:用来存放动态变量, 如指针。要通过设计者自己管理变量,自行进行创建和清理工作。(利用newdelete) 
    3.
自由存储区:就是那些由malloc 等 分配的内存块,他和堆是十分相似的,不过它是用free 来结束自己的生命的。 
    4.
全局/ 静态存储区:全局变量和静 态变量被分配到同一块内存。 
    5.
常量存储区:用来存储常量,即不能被修改的变 量。
­
    
以上是内存分区的问题,下面是我理解的问题:  
    1.
变量声明与定义: 
    
声明只是告诉编译器有这么一个变量,而定义在声明的同时便进行内存分配。
//------1.cpp--------------

#include
using namespace std;
extern int n;//
声明变量n, 只告诉有这么一个名字
void function(int a){....};//
定义形参a, 并分配内存
int main(){ 
    int i; //
定义变量i, 并分配内存 
    return 0;
}

     其中,对于函数function, 形参a 的生存期在函数体内,在函数结束工作后,a 便被释放,从栈中弹出 。(a 所占的内存和内存地址 现在没有变量使用了), 来看下面的代码;

#include
using namespace std;
int *p=NULL;
void fun(int a){ p=&a;}
int main(){
    int n=10;
    fun(n); 
    cout<
    return 0;
}

     代码执行的结果是显示a 的内存地址,然而在原来的我理解是a 仍然占着这块内存区域,但是其实不是的,a 早已被弹 出栈,所以这块区域是空着的。之所以会这样,是因为指针p 是全局的,p 存放了a 的地址,p 的生存期没有结束,所以仍指向这块地址,所以会显示a 的 原来的内存地址。
­
    
由此,我就理解了传值返回和引用返回,为什么引用返回不能返回局部变量。第一,引用返回返回的是实际地址,即可用的。第二,如果返回局部变量,那么 局部变量结束生存期被释放后,那块内存就空着了,没有变量用,所以不能操作 ........ 如 果用传值返回返回局部变量却是可行的,因为传值返回在执行renturn 语句的时候要进行拷贝, 把即将释放的局部变量的值拷贝到临时变量上。。
­
    
再来就是对于newdelete:
//-----------------------------2.cpp--------

#include
using namespace std;
int main(){ 
    int *p=new int(4);//p
存储在栈中,动态分配得到的内存存在堆中,从而通过指针指向一个无名字的堆来进行相关的操作....... 
    ................ 
    ........... 
    delete p;//
释放p, p 还是指向原处,因为p 没 被释放,被释放的是无名字的堆内存区块!! 
    return 0;
}
    
所 以,我就理解认为,其实在编写代码时用到的变量,只不过是给底层的内存区域提供一个名字,然后间接地操作内存的内容...................
http://jpkc.cqit.edu.cn/jpkc/07/%E4%B8%8B%E8%BD%BD%E8%B5%84%E6%96%99/C%20%E8%AF%AD%E8%A8%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E9%9B%86/ccfaq.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值