堆和栈的区别
计算机分配内存的时候会分出堆和栈两个区域
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”的地址。