结构体的定义和初始化:struct stu{};//声明一个结构体,struct stu s//定义一个结构为stu的结构体。初始化的时候可以指定初始化,点号加数据成员名称。 结构体内存的对齐:将最大内存的元素大小作为宽度,构成一个矩形,而且是顺序排列。所以我们放元素的时候,就是和整理宿舍一样,将大的放在前面,然后放小的,这样最节省内存。对于结构体中元素应用指针的时候,我们要能够准确的知道指针知道了哪儿。其实和处理数组一样。如果结构体包含数组,那么处理的时候也是分开的,以它的数据类型来处理,如果里面包含int和char数组,以int来对齐。 注:数组相互之间不可以赋值,但是可以借助结构体来赋值。数组的名称是一个常量。也可以使用memcpy(a1,a2,sizeof(a2)); 结构体的位长:char i:2;//定义一个char类型,只有2个bit,只能小于char标准的大小,不能大于一个字节。对于结构体来讲,最小单位就是字节,即使不够一个字节,也得当作一个字节处理。不管你处理的位是多少,计算机是按你结构中的最大类型来对齐的。 Struct m{char i1:2;char i2:2;char i3:2;}//sizeof(m) = 1
Struct m{int i1:2;int i2:2;int i3:2;}//sizeof(m) = 4
Struct m{char i1:2;int i2:2;int i3:2;}//sizeof(m) = 8
|
结构嵌套:结构体成员如果也是结构体,那么内部的结构也独立对齐的。结构体指针也是4个字节。如果出现不能整除的情况,默认结构体是右对齐的;否则是,左对齐;其他时候,都是左对齐。 网络是按照字节流来传递数据的,宽度是一个字节。 对结构中的元素按照某一成员排序:使用冒泡排序法,在交换的时候,要将所有的成员都交换。在某一行排序的情况下,在按另一行排序,其实就是多一个else if就好了。 结构体成员出现指针和数组:在堆中分配的内存,这个时候要注意内存拷贝的问题,那么结构体成员在赋值的时候,不能简单地拷贝,因为在释放内存的时候,m1和m2的成员实际是一个内存,如果m1结构体分配内存,同时也得给m2分配内存。 结构作为函数的参数或者返回值: 值传递的时候,是讲结构体完全的拷贝,一个大型结构的内存拷贝,效率是很低。这个时候使用结构指针,效率很高。返回值的时候,不可以使用栈指针,得使用堆指针或者是静态变量地址,或者是二级指针。 联合体:所有成员共享一块内存,每个时间段只能一个访问。以最大的数据类型为联合体的大小。包含指针成员的时候,在释放某个成员的时候,其他的成语如果赋值的话,这个时候其实已经地址丢失了。 枚举:enum是int类型的常量,默认从0开始,可以修改它的值,如果赋值的话,之后的数值递增。 #define和typedef:都可以使程序易于扩展;一个是预编译指令,一个是C语言的语句。如果定义的是一个常量,那么建议用define,如果是要说明一个数据类型,使用typedef 合适一些,但是使用define貌似也是可以的。但是在定义一个函数指针的时候,我们就得使用typedef了。 Int func(int a,int b) --typedef int (*FUNC)(int a,int b);
//定义了一个FUNC类型的函数指针。
|
|