工作一年多,越来越明白数据结构的重要性,开始重学数据结构
1.指针
指针存的是数组的第一个元素的第一位内存的地址
指针指向第一个元素的地址 ,和第二个元素的地址,与元素的类型有关
指针存的地址的位数与机器操作系统位数有关(内存单元大小),32位 64位
操作系统位数32位,2^32 最大寻址 ,有效内存4G
64位 有效内存理论有128G
指针有两个属性 一个是地址,一个是空间的长度
int * p ,int * 是长度 p是地址
2.结构体
struct Model {}自定义
struct Model m 声明
&m 对象m的地址
传参可以直接传结构体,也可以传它的地址,赋值给形参指针 //(不过声明的时候要指定类型,分配指定位数,不然解析不出来)
struct Model * p //(struct Model *) 是这个指针p的类型
(*p) // (*p)相当于对象实例了
(*p).value //对象的属性
p->value === (*p).value 等价
3.malloc 动态分配(开辟空间)
c语言通过malloc 可以实现动态分配
自定义int数组长度 len
int * pArr=(int *)malloc(sizeof(int) *len)
malloc括号里输入要开辟字节数,会返回一个指向它的指针(未定义类型的,属于字节型空间void *) (指针只存了对象第一个字节的地址)
为什么要强制类型转换?
开辟了空间之后要定义每个空间的大小,就要通过强制空间转换来实现,(告诉编译器);不强制转换也行(可能编译器会自动转),要赋值的指针有它的类型,反正开辟之后的空间啥数据都没有,随便给指针赋值都是第一个字节的地址,空间大小根据最后指针的类型来决定