平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出;堆就是先进先出。下面我就常见的例子做分析:
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
不知道你是否有点明白了,堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
数据类型分为值类型和引用类型,基本数据类型就是值类型,存放在栈内存中;引用类型存放在堆内存中
总结:
(1)在JS中数组类型就是引用类型,所以存放在堆之中,就是说数组的地址存放在堆中,而数组的值存放在栈中。一般的数据比如var a=10;此时就会在栈中开辟一个新的空间用于存放a;而var a=[1,2,3,4];此时数组a的地址存放在堆中,而地址指向的值就会在栈中。
JS文件:
function abc(a){
a=100;
}
function abc2(arr){
arr[0]=0;
}
/********************************************************************************************************************/
/* //值传递和引用传递
//1.值传递
var b=0.01;
abc(b);
alert(b);
输出:0.01
//数组是引用类型,传递的是地址
var arr1=[123,2343,435];
abc2(arr1);
for(var i=0;i<arr1.length;i++){
document.writeln(arr1[i]+" ");
}
输出:0 2323 435
(2)注意区分值传递和地址传递的不同