复合类型学习总结

今天开始学习复合类型,自己构建的数据类型。

结构体的定义和初始化: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类型的函数指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值