1.计算机中堆栈的原理详解

本文详细介绍了计算机内存的基本单位、内存地址、堆栈和指针的概念。堆栈是程序运行时的重要组成部分,用于存储函数局部变量和参数,而堆则允许程序员动态分配内存,虽然效率较低但更为灵活。指针作为内存地址的变量,用于存储和操作内存地址。在程序中,内存被划分为栈、堆、代码区和数据区等不同区域,以高效管理各种数据和指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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"优化成一个地方。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值