C++基本语言包含10章节内容,存于C++从入门到精通专栏
目录
一、范围for语句:用于遍历一个序列
我们可以不使用拷贝动作;直接采用引用的方式
二、动态内存分配问题
c知识补充
在c语言中,我们知道供(用户)程序使用的存储空间:程序区,静态存储区,动态存储区
程序执行所需的数据就放在静态存储区和动态存储区中,存储区就理解成内存。
静态存储区:全局变量(在函数的外部定义的)放在静态存储区中,程序开始执行时给全局变量分配存储区,程序执行完毕后释放这些存储区。在程序执行过程中,占据着固定的存储单元,而不是动态的分配+释放
动态存储区:
(1)函数形参,函数形参被看作局部变量。
(2)局部变量,如函数内定义的一些变量。
(3)函数调用时,调用现场的一些数据和返回地址等。
一旦你调用完函数,返回去后这些内存就会被释放掉
一般来说,这些数据在函数调用开始时分配存储空间,函数调用完毕,这些空间就被释放掉了。这种分配和释放,我们就认为是动态的
如果你两次调用同一个函数,分配给此函数的局部变量等等的存储空间地址可能就是不同的。
C++知识
在C++中,把内存进一步更详细地分成5个区域:
在C++中,把内存进一步更详细地分成5个区域
1)栈。函数内的局部变量一般在这里创建,由编译器自动分配和释放。
2)堆。由程序员使用malloc/new申请,free/delete释放。 malloc/new申请并使用完毕后要及时free/delete以节省系统资源,防止资源耗尽导致程序崩溃。如果程序员忘记free/delete,程序结束时会由操作系统回收这些内存。
(注意有些程序全年运行,别指望系统回收)
3)全局/静态存储区。全局变量和静态变量static放这里,程序结束时释放。
4)常量存储区。存放常量,不允许修改,如用双引号包含起来的 字符串“I love China”。
5)程序代码区。相当于C语言中的程序代码区。
这5个区域重点关注堆和栈。堆和栈都 相当于C语言部分所说的动态存储区,但用途不同。下面总结一下堆和栈 的区别:
(1)栈 空间有限(这是系统规定的),使用便捷。例如代码行 int a=4;,系统就自动分配了一个4字节给变量a使用。分配速度快,程序员控制不了它的分配和释放。
(2)堆 空间是程序员自由决定所分配的内存大小,大小理论上只要不超出实际拥有的物理内存即可,也在操作系统允许你分配的最大内存大小之内,都可以分配给你。
分配速度相对较慢,可以随时用malloc/new分配、free/delete释放,非常灵活。
C语言的malloc和free
在C语言中,用malloc和free从堆中分配和释放内存;malloc和free()是函数;
malloc(memory allocation内存分配),动态内存分配
malloc的一般形式:
说明:
NumBytes:表示要分配的字节数;
void *是一个万能的类型的指针;也就是说void *可以被强制转换成任何其他类型指针。
要是分配成功就返回 指向被分配内存的指针,分配失败的话就返回NULL
分配成功后且当内存 不再使用时,应使用free()函数将内存释放。
free的一般形式:
该函数是将之前用malloc分配的内存空间还给程序或者操作系统,也就是释放先前分配的内存,这样这块内存就被系统回收并在需要 的时候由系统自由分配出去再使用
举例说明1:(point不指向空值)
举例说明2:
strcpy_s看起来有点熟悉,第1部分学习过strcpy函数,但这 里多了一个_s,代表的是strcpy函数的安全版本,能够检测所容纳的元素是否越界,如果越界则会停止程序运行并弹出警告窗口。
解释说明:
*q++;++与*优先级相同,从右到左结合
*(q++),q++是先用后加;
作用:得到q指向变量的值(*q),然后在使q指针自+1,指向下一个数组元素
C++的new和delete
在C++语言中,用new和delete从堆中分配和释放内存
new和delete是运算符(标识符),不是函数。
C++中使用new和delete从堆中 分配和释放内存,两者成对使用。不再使用malloc和free来分配和释放内存(C++中不可使用)
new/delete做了和malloc/free同样的 事情——分配和释放内存,同时,new/delete还做了更多的事情。
new一般使用格式:
演示1:
演示2:new后面有圆括号,表示给这个空间值
演示三:new[];delete[];中括号配对使用,delete中括号内不用写数字
额外强调几点:
(1)配对使用,有malloc成功必有free,有new成功必有delete。
(2))free/delete不要重复调用,因为free/delete的内存可能被系统立即回收后再利用,再free/delete一次很可能把不是自己的空间释放掉了,导致程序运行出现异常甚至崩溃
思考 malloc/free (C语言)和new/delete(C++)区别问题 -------(以后讲解)
简单来说,就是new/delete做了更多的初始化和释放工作
三、nullptr :C++11中引入的新关键词
nullptr :代表“空指针”
注意:int a=nullptr;//报错,nullptr :代表“空指针”
int b=null;//成功
使用nullptr能够避免在整数和指针之间发生混淆
使用typeid是打印类型名的;
结论: nullptr和null不是同一个类型;
对于指针的初始化,能用nullptr的全部用nullptr。
以往用到的与指针有关的NULL的场合,能用nullptr取代的全部用nullptr取代。