站长之家怎么查询网站哪家做的,未来最吃香的十大行业2022,营销型网站建设目标,全国企业信用信息平台结构体和数组一样#xff0c;都是一群数据的集合#xff0c;不同的是数组当中的数据是相同的类型#xff0c;但是结构体中的数据类型可以不相同#xff0c;结构体里的成员叫做成员变量
结构体类型是C语言里面的一种自定义类型#xff0c;我们前面已经了解到过int,char,fl…结构体和数组一样都是一群数据的集合不同的是数组当中的数据是相同的类型但是结构体中的数据类型可以不相同结构体里的成员叫做成员变量
结构体类型是C语言里面的一种自定义类型我们前面已经了解到过int,char,float,double等数据类型结构体也是一种数据类型而且是使用者自己定义的数据类型用法如下
1.结构体类型的声明
struct stu
{char name[20];int age;char sex;
};
2.结构体变量的创建和初始化
结构体变量.结构体成员------对应的参数进行打印
struct stu
{char name[20];int age;char sex;
};struct stu t{小明,15,男};
struct stu
{char name[20];int age;char sex;
}s1{小明,15,男};
//这种是在声明结构体同时定义变量
//也可以额外定义struct stu s1{小明,15,男};struct stu s1{.name小明,.age15,.sex男};//这种可以不按照顺序3.结构体传参
#includestdio.h
struct s
{int num;
};struct s t 100;
void print1(struct s t)
{printf(%d\n, t.num);
}void print2(struct s *p)
{printf(%d\n, p-num);
}int main()
{print1(t);print2(t);return 0;
}
这里给出了传值传地址两种方式当参数较大时候传参时候压栈会使得系统在时间空间的开销过大所以尽量使用传地址的形式
4.结构的自引用
一个结构体里面不能够包含一个相同的结构体但是我们可以使用结构体指针线性数据结构包括顺序表和链表顺序表就是按照一定的顺序依次排列的结构链表就是像链子一样串连起来的结构链表包括数据域和指针域数据域用来储存相应的数据指针域便于找到下一个数据
struct Node
{int time;struct Node* next;
};
//这种引用的方法是正确的如果不使用指针我们无法计算结构体的大小所以们我们用结构体指针
typedef struct
{int time;Node* next;
}Node;
//这个是对匿名结构体的重新命名这种写法是错误的因为Node没有定义就是用了Node*
5.结构体的大小--内存对齐现象
1结构体的第一个成员对齐到结构体变量起始偏移量是0的地方
2对齐数是编译器的默认对齐数8和结构体成员变量的较小值
3结构体的总大小是最大对齐数的整数倍最大对齐数是所有成员对齐数的最大值
4结构体嵌套结构体的时候嵌套的结构体成员对齐到自己成员最大对齐数的整数倍整个结
构体的大小就是所有结构体成员最大对齐数的整数倍把内置的嵌套结构体也当作一个结构体成
员
5根据结构体的对齐规则我们应该尽量让小的结构体成员放在一起大的结构体成员放在一
起这样就可以节省时间和空间
6.结构体实现位段功能
1位段中的位是指二进制位一个二进制位是一个比特举个例子int a:2;正常情况下一个整型a
要占4个字节也就是32个比特位但是我们只为他分配2个比特位来存放数据2的二进制表示是
00202个比特位就存放后两位20这样就节省了6个比特位由此可见位段就是为了节省内存
空间但是位段不具有跨平台性
2位段有时候几个成员共同使用1个字节所以不能对他直接取地址所以应该定义变量对变
量输入一个值然后将这个变量的值赋值给结构体的成员
8.枚举
枚举就是把可能的值一一列举比如一周有7天 枚举类型的使用当然我们在使用的时候可以给枚举常量赋值 9.联合体共用体
联合体的成员共同使用一块内存空间一起使用的时候会影响彼此的数值所以联合体的使用条件就是联合体的成员不会同时使用互不影响 这个案例是使用匿名联合体判断机器是大端还是小端
10.联合体的大小
联合体的大小至少是最大成员的大小 但是通过上面这个案例我们可以知道联合体也有对齐现象char是5个1int是4但是满足最大对齐数4的整数倍所以是8