堆和栈的区别

  计算机分配内存的时候会分出堆和栈两个区域

  1、堆:一般由程序员分配释放,存放字符串、数组等。

  2、栈:用来存放函数的参数值、局部变量的值等。

  为方便了理解,可以把堆想象成仓库,而栈可以想象成仓库的记录、索引。

值类型和引用类型

  值类型有整型、字符型、布尔型、浮点型、自定义结构体等。值类型是存放在内存的栈区。

  引用类型有数组、字符串等。引用类型存放在内存的堆区。

 

 1         static void Hello(string a)
 2         {
 3             a = "你好";
 4             Console.WriteLine("2、"+a);
 5         }
 6 
 7         static void Main(string[] args)
 8         {
 9             string n = "hello";
10             Console.WriteLine("1、"+n);
11             Hello(n);
12             Console.WriteLine("3、"+n);
13 
14         }

 

  我们都知道字符串是引用类型,传址方式,分析上面代码,对于初学者,也许会以为输出结果是:1、hello;2、你好;3、你好。但实际是:

为什么实际显示不一样呢?

  分析:字符串是存放在内存的堆区,字符串实际上是字符数组,数组的长度是不能改变的,所以,当为字符串变量重新赋值的时候,是计算机在堆区新建了字符串,并把地址赋给变量。第10行中,当定义n=“hello”时,在堆区创建了字符串“hello”,在栈区创建了变量n,n中存的是堆区“hello”的地址。当程序运行到第3行的时候,实际上是计算机重新在堆区创建了“你好”,并把地址给栈区的形参a;在此过程中,栈区n中存放的还是“hello”的地址。

 

 

  

posted on 2014-08-31 23:27  幻影K  阅读(158)  评论(0编辑  收藏  举报