1.计算机中堆栈的原理详解
1.1所需知识
1.1.1内存
位:bit 数据储存的最小单位,就是计算机上的 01 0 1这些东西中的数字,每一个数字代表一位
字节:byte 8个位代表一个字节,一个字节能表示0-255的数字,也就是我们常说的B
1KB =1000B
字符:程序中的a A 123以及汉字 人都是字符,在计算机程序中有具体分配好的这些编码来表示他们,有些复杂的汉字是要用多个字节存储。英文字母在ASCLL中
1.1.2内存地址
定义:内存地址表示内存的编号,代表一个内存空间。
内存空间是以byte为基本单位的,比如说一个操作系统内存4GB,也就是说这个程序总共的地址数
2
32
2^{32}
232。
这个内存地址,我们可以通过4位16进制或者8位16进制数来表示。这是由于计算机硬件的原因造成的,有些cpu只能寻址16位,所以用4位就够了,有些寻址32位,因此要用到8位16进制来表示
例如,计算机要储存"杨雄飞"这个词组,需要分别储存三个字,每一个字又占据两个字节16位。因此杨雄飞这三个字占据6个字节,需要6个地址进行存贮。一般对于占多个字节的变量,它的地址是指首地址。
不同的地址区域存储了不同的程序的量,有些存储命令,有些存储变量等,如果杂糅一团,效率会非常低下,因此在编程时,会对代码进行分区,这就有了,堆栈,代码区等概念。
问题:关于cpu寻址是什么意思
1.1.3 链表
1.4 指针
指针就是一个存储变量的地址的变量,因为比较特殊,所以这个变量前加一个声明*,同时要注意,指针也是有变量类型的,这个类型是告诉计算机等下要寻找指针所对应的值时,我们要占用几个字节的内存,例如
int a = 10 ;
int *p =a;
就是告诉计算机按照这个指针确定值时需要占用堆中4个字节的内存。但是指针前面的声明P并不意味着这个指针的内存长度占4个字节。int 和 double型的指针,本身存放他们的地址长度都是一样的,前面的变量名是在计算机在对指针解引用的时候才发生作用的,int
注意点:数组名也是可以当成指针来用的。
*(p+1)和arr[i]是一个意思。
new运算符和delete:
使用方法:
int * p = new int; //new int告诉程序要分配一个int型的数据类型,并将它返回一个指针,这个指针指向的值是int类型
delete p; //当程序执行完以后,通过delete关键字释放掉p指向的内存
1.5堆栈
一般地,程序运行时会将程序分为四个区:
栈:存储函数中的局部变量参数等,函数调用结束,栈的地址就被重新释放,所以栈的方式比较灵活
堆:允许程序员自主申请内存,通过关键字new 申请内存,堆中一般速度比较慢,而且容易产生内存碎片,不过用起来比较方便。
指针的本质就是将指针存贮在栈上,它所指向的值在堆上
代码区:存储指令
数据区:分为全局变量和局部变量,全局,常量,静态全局变量均存储于此,局部区存储局部变量等
局部自动变量:调用函数的时候就入栈,函数结束的时候就出栈,
int a = 0; //全局初始化区
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);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}