/
...
/
/
三.指针和存储持续性
Search
Try Notion
三.指针和存储持续性
导言: 由 指针→动态指针组→new/delete→持续性话题
一.指针简介
中提到需要知道存储在哪里
除了利用变量名来指明该位置外,也可通过指针存储变量地址的方式解决
简单指针的声明/初始化: ....
指针的注意事项
野指针: 野指针指指向一个已删除的对象或未申请访问受限内存区域的指针
直接将指针赋值常数
在对指针解引用之前,需要将指针赋值或初始化为恰当的地址
🤔数组和指针组区别
迭代器区别
使用数组创建 可正常使用for(int x : a)
指针创建则不行
二.指针层级
如何划分指针的层次以区分 int *a[10](a)[10](*a)[10] ?
🤔指针层级法
我们把一个对象需要解引用的的次数称作指针层级
int a 相当于0层指针
int *a 相当于1层指针
数组标志[...]在指针层级上完全等价于* , 但是设 数组标志所在的结合层xxx1x-1层会是数组实体
int *a[10]int (*a)[10] 都是二级指针的定义
由于后缀运算符优先性, int *a[10] 先和数组标志结合, 代表数组位于0层 ,即 数组的指针
int (*a)[10] 由于括号先结合,数组结合标志位于第二层,代表第一层为数组指针,即 指针的数组
三.new/delete运算符
typename * pointer = new typename
常规变量分配与new分配 内存辨析
常规变量: 编译时分配有名称的内存
new分配: 运行时分配未命名的内存空间 替代普通C语言的 malloc()
new/delete用法
动态指针组的创建
使用new 创建动态数组没法创建时候同时初始化 int *p = new int[8](1) 不可行 但单一对象可行 int *p = new int(1) ;
不像数组和指针组,此处只能使用 *p 而没有 p[]的动态数组,但我们往往将动态指针组称为动态数组
delete常见规则
new/delete和new[]/delete[] 配套使用
不能对同一个地址delete 2次
对空地址(空指针) delete是安全的
四.存储持续性(内存分配方式)
存储持续性简介
自动存储:
函数内部定义的变量
🤔:局部变量是在作用域的角度划分的,作用域为块内,虽然他们很多情况下相同
存储在Stack中
静态变量
static声明变量 或 在函数外部定义
声明周期为整个程序
动态变量
使用new delete创建 需要手动管理
heap上创建
内存泄漏