【C++】 ——指针和引用的区别、数组和链表的区别

1、指针和引用的区别

都是地址的概念,指针指向的是一块内存,它的内容是内存的地址,但是引用是一块内存的别名。
区别:

  • 指针是一个实体,但是引用仅仅是别名
  • 引用使用时,无需解引用(*),但是指针需要解引用
  • 引用只能在定义的时候被初始化一次,之后不可改变,但是指针可变
  • 引用没有const,但是指针有const
  • 引用不能为空,但是指针可以为空
  • sizeof引用的时候得到的是所指向变量(对象)的大小,但是sizeof 指针得到的是指针本身(变量或者对象的地址大小)的大小
  • 从内存分配上来看:程序为指针变量分配内存区域,而引用不需要分配内存区域

2、数组和链表的区别

1)数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址A,则第二个元素就是A+1,但是链表不一样,链表每个节点没有相对固定的位置关系,链表每个节点的内存是不连续的,某个节点在地址A,其后的结点不一定是A+1,而是在内存的其他空闲区域,呈现出一种随机状态

2)数组一旦被显示声明后,其大小就固定了,不能进行动态扩充,但是链表可以,可以动态生成节点并且添加到已有的链表后面

3)链表灵活,但是空间和时间额外耗费较大,数组大小固定,元素位置固定,但是操作不灵活,容易浪费空间,但是时间耗费较小,尤其是元素变化不大的时候效率恒高。双向链表比单向更灵活,但是空间耗费也很大

4)对于增删查改操作,数组在插入和删除数据时候的效率较低,插入数据时,需要将插入位置之后元素的位置向后移动,删除元素的时候,需要将这个位置之后的数据向前移动,但是随机读取的效率很高。而链表增加和删除数据很容易,因为不具有随机访问性,所以在访问某个节点的时候都需要从头开始顺序访问,直到找到需要查找的元素。

3、malloc和new的区别

  • maolloc和free是C++/C语言的标准库函数new/delete是C++的运算符,他们都可以用于申请动态内存和释放内存。
  • 对于非内部数据类型的对象来说,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不再编译器控制权限之内,不能够吧执行构造函数和析构函数的任务加于malloc/free
  • new可以认为是malloc加上构造函数的执行new出来的指针直接带类型信息的,但是malloc返回的都是void指针
  • malloc是底层的,new的实现是调用了malloc来实现堆内存的统一管理,所以我们可以认为ne是maloc的扩展通跟班,而且但从内存分配的功能来说,他们是在同一块内存区域实现统一管理。

4、什么是内存泄漏?怎样避免内存泄漏?

内存泄漏是指程序中已经分配的堆内存由于某种原因,程序未释放或者无法释放,造成一个系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
怎样避免内存泄漏?
良好的编程习惯,尽量在设计内存的程序中,检测出内存泄漏,当程序稳定之后,再来检测内存泄漏一定会增加排除的困难和复杂度。使用内存分配函数,一旦使用完毕,要记得使用相应的函数释放掉。

原创文章 78 获赞 21 访问量 3537

猜你喜欢

转载自blog.csdn.net/Vicky_Cr/article/details/105593507
今日推荐