合并两个有序链表续

32 篇文章 0 订阅

上一篇文章里面做题熟悉了指针、分配内存和链表的操作,链表的实现需要使用指针,C++里面有指针,所以可以很直观的实现,但是还有很多编程语言比如java,python,C#里面没有指针的概念,这些语言是怎么实现链表这种数据结构的呢?

复习一下堆与栈的概念。C++中,一个程序使用栈内存的大小必须是固定的,程序刚开始运行时,就会通知操作系统分配足够的栈内存。而因为栈内存大小有限,所以栈内存不能在程序运行时再进行申请。如果程序运行时需要扩展空间,就需要使用堆内存。

而我们回想一下编写链表结构的过程,因为链表的长度是动态的,我们必须将它分配到堆内存中。而new函数返回的是一个指针,变量被new分配到堆内存中之后,这个变量就没有变量名,我们必须通过一个指向堆内存中的指针来访问它。所以我们在函数和程序中的变量存的都是地址,还要把原来的成员访问运算符"."改成缩写"->"。

除了链表,大多数的数据结构比如向量,字符串,二叉树也都是动态的,正常编程的时候,把类分配在栈内存中的情况非常少见,也不是必须,所以类似java,C#之类的语言就直接进行了一次简化,规定类必须分配在堆内存中。

于是,在C++中,你可以通过两种方法把类实例化:

//假设类名为box
box box1(1,2);//定义在栈中
box* box2 = new box(1,2);//定义在堆中

C++程序更好理解,也更加通俗易懂,在程序中有名字的变量都是栈中的变量。我们也能很直观的看出box2是一个指针。

而在java中,就只能这样实例化类,不了解C++那段程序很可能看得一脸懵逼:

box box1 = new box(1,2);

 这里box1可以理解成是一个指针,但是更严谨的说这是“引用”。C++中变量不分值类型和引用类型,而java这种设计使得变量分为值类型和引用类型,只有最基础的变量如int是值类型,其它的都是引用类型,即这个变量在栈中只储存了一个指向堆中变量的地址,堆中储存了这个实例的所有数据。 

这样设计也有优点,最明显的优点就是你不用按着shift打大于号箭头了,还有就是删除了指针使得安全性得到提升,你只能访问堆中给你的程序分配的内存空间,而不能越界了。

 顺便说一句,java来源于C++,java和C++真的是兄弟,语法几乎一模一样,把之前的C++程序中多余的*去掉,再把关键字nullptr改成null,就可以跑起来了。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值