01 衡量算法的标准
- 时间复杂度:程序大概要执行的次数,而非执行的时间。
- 空间复杂度:大概所占用的最大内存
- 难易程度
- 健壮性
02 指针
2.1 指针的定义
先举例:
int * p;
p是个指针变量名,int *表示该变量p只能存储int类型
变量的地址
。
地址:内存单元的编号
- 指针就是地址,地址就是指针
- 指针变量就是存放内存单元地址的变量
- 指针的本质是一个操作受限的非负整数
内存在操作系统中的使用:
- 软件在运行前需要向操作系统申请存储空间,在内存空闲控件足够时,操作系统将分配一段内存空间,并将外存中的软件
拷贝
一份存入该内存空间中,并启动该软件的运行。 - 在软件运行期间,该软件所占内存空间不再分配给其它软件
- 当软件运行完毕后,操作系统将回收该内存空间,但操作系统并
不清空
该内存空间中遗留下来的数据,以方便再次分配给其它软件使用。
综上所述,一个软件所分配到的空间中极有可能存在着以前其它软件使用后的残留数据,这些数据被称之为垃圾数据
。所以,通常情况下为一个变量分配好内存后,最好要对该变量初始化。
2.2 指针的分类
- 基本类型的指针
- 指针和数组的关系
一维数组名是个指针常量
,指向第一个元素
的地址,所以存放的是第一个元素的地址,它的值不能
被改变。
下标和指针的关系:
a[i]
等价于 *(a+i)
03 结构体
//定义一个结构体
struct Student
{
int id;
string name;
}
//声明一个结构体变量
struct Student s1={
001,"dawei"};
struct Student *p1=&s1;
04 动态内存的分配和释放
int len=10;
int * array=(int *)malloc(sizeof(int)*len);
//malloc返回值是void*,所以要进行强制转换
free(array);
05 跨函数使用内存
静态分配是在栈上进行,使用完就自动释放;
动态分配是在堆上进行,使用完需手动释放。