People Lack Willpower,Rather Than Strength!
1.指针与数组
- 相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。== (pointer2地址值 -pointer地址值) / sizeof(所指向数据类型).
- 相加:无意义!
2.指针与字符串
- 字符串定义:
- 字符数组:使用字符数组来保存的字符串是保存栈里的,保存栈里面东西是可读可写,所以我们可以改变里面的字符,当把一个字符串常量赋值一个字符数组的时候,那么它会把字符串常量中的所有字符都放到字符数组里面.
- 字符指针:使用字符指针来保存字符串,它保存的是字符串常量地址,常量区是只读的,所以我们不可以修改字符串中的字符.
3.指针函数&函数指针
指针函数概念:在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数.
-
函数指针:函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。这个入口对于指针就是一个突破口!帮助指针快速定位函数空间!
- 应用:调用函数; 将函数作为参数在函数间传递!
4.结构体
-
为什么要有结构体类型?
- 结构体可以把功能相同的数据组织起来(封装数据),存在一起,用的时候方便
- 在调用函数时,若传递参数较多,传一个结构体相对而言简单一些。
- iOS开发中经常需要使用结构体
-
匿名结构体定义结构体变量
- 省去了结构名,而直接给出结构变量,这种定义变量最大的问题是,不能再次定义新的结构体变量了。但有时这种缺点也会变成优点!
-
结构体存储原理
-
何时分配空间:
- 和其他一般类型一样,定义结构体类型时并不分配内存空间,只有定义变量时,才会分配空间!
-
为什么要有对齐算法?⭐️
- 内存是以字节为单位编号,但
一些硬件平台对某些特定类型的数据只能从某些特定地址开始
, 比如从偶地址开始。若不按照适合其平台的要求对数据存放进行对齐,会影响到效率。 因此,在内存中,各类型的数据是按照一定的规则在内存中存放的,这就是对齐问题。 - 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的
对齐模数(alignment modulus)
。 - 这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。比如这么一 种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能 保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否 则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节 内存块上。
- 内存是以字节为单位编号,但
-
对齐模数的确定:
- 方法1:可以理解为每一次分配多少个字节存储空间,可以通过#pragma pack()指定
- 方法2:默认情况下,对齐的模数是占用存储空间最大的成员所占用的字节数
- 对齐模数:#pragma pac指定的数值和结构体内部最大的基本数据类型成员长度中数值较小者。而结构体实际长度为---该模数的整数倍。
-
-
结构体嵌套
- 结构体不可以嵌套自己变量,可以嵌套指向自己这种类型的指针❤️!
结构体指针&结构体数组
结构体作为函数形参
-
枚举类型:
- 枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再
分解
为任何基本类型。 - C语言编译器会将枚举元素作为整型常量处理,称为枚举常量
。
- 枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再