assert():
是一个宏,并不是函数,包含在assert.h的头文件中,括号里的值为假终止程序,并报错。为真则继续运行程序。在 release版本下会自动优化这个宏,也就是首在release下并不存在assert。 可以把它看成是在任何系统状态下都可以安全使用的无害测试手段,如果程序在assert处出错,并不是说包含assert函数出了错,而是调用者出了错,
malloc()
申请0字节内存并不会返回NULL而是返回一块正常的地址只是你无法用这个地址而已
引用的一些规则
- 引用被创建的同时必须初始化。(指针可以在任何时候被初始化)
- 不能有NULL的引用,引用必须与合法的存储单元关联(指针可以指向NULL)
- 一旦引用被初始化就不能改变引用的关系(指针可以随时改变所指对象)
内存管理
内存分配的方式有三种:
- 1,在静态存储区分配,内存在编译时已经分配好,这块内存在程序的整个运行期间都存在,它上面存放全局变量和static变量
- 在栈上创建, 在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时这些存储单元被自动释放, 栈内存分配运算内置于处理器的指令集中,效率很高但是分配的内存容量有限
- 从堆上分配内存,也称为动态内存分配,程序在运行时用malloc或new申请的内存,由程序员负责在运行结束之前调用free或delete释放内存,动态内存的生存周期由我们自己决定。
顺序表
- 顺序表长度固定,必须在分配内存之前确定长度。
- 存储空间连续,支持随机访问
- 存储密度大要访问特定元素可以使用索引(下标)访问,时间复杂度为O(1)
- 要想删除或插入一个元素都需要动这个位置后面的所有元素,因此时间复杂度为O(n)
- 重要的一点是顺序表的访问效率高,由于CPU提取数据时采用缓存技术
链表
- 长度不固定,可以任意增删,需要时创建
- 存储空间不连续,节点之间通过指针连接,每个元素周围只能访问一个元素(单链表)
- 存储密度小,因为每个节点都要存储下一个元素的指针(双链表则需要存储两个指针)
- 访问特定元素只能从头结点开始遍历链表,时间复杂度为O(n) 链表同时也带来一个很头疼的问题,就是频繁申请空间会造成内存碎片,
C/C++区别
- 文件区别:C语言以.c为后缀,C++以.cpp为后缀
- 返回值:C没有指定返回类型时默认返回int型,而C++中一个函数没有返回值必须设职位void否则编译不通过
- 参数列表:C语言中没有指定参数列表时默认可以传多个参数,而C++中没有指定时默认为void,不接收任何参数
- 缺省参数:C语言不支持给函数参数指定默认值,而C++支持,如果指定了默认参数,在调用时可以带参也可以不带参(但慎用,容易产生二义性)
注意: 1,带缺省值的参数必须放在参数表的最后面 2,在函数声明和定义中只能出现一次 3,缺省值必须是常量或全局变量 4,缺省参数必须通过值参或常参传递
- 函数重载:C语言不支持函数名重载,C支持,这是由于编译器对各自函数名的修饰规则不同。C支持在同一作用于中声明几个同名的函数但要求是它们的参数列表不同(参数类型,个数,次序的不同)
- 指针和引用:C语言调用函数传参时有两种方式,传值和传址。传值是在函数调用时会对参数有一份临时拷贝,其优点是避免了函数调用的副作用,但是无法改变实参的值。如要改变,必须传址,传址就必须要用到指针,指正又不友好,不安全;而C++就引入了引用,引用就是给已存的变量取了一个别名,编译器就不会为引用变量开辟内存,它