结构体
结构体类型—用来描述复杂数据的一种类型,它是构造类型的(用户自定义类型)一种;
声明一个结构体类型
语法:
struct 结构体名
{
成员列表;
};
理解:
(1)struct关键字表示在构造一个结构体类型;
(2)结构体名是用来描述结构体这个类型的一个名称;
(3)成员列表,它定义的形式,与之前的定义变量的方式是相同的,也用之前的那些数据类型定义,它不仅可以定义变量,还可以定义数组和指针变量;多个成员定义变量的时候,注意要用分号隔开;成员列表表示要描述的复杂数据中用到的具体的成员变量;
(4)特别注意在最后面是有个分号表示结束的;
举例:
struct student
{
int sno;
char name[30];
char sex;
float score;
}; //表示定义出了一个学生这样的数据类型
此时的struct student就是结构类型
结构体类型的使用的过程:首先先定义出一个类型,再去定义需要的变量,定义变量的形式是:
struct 结构体名 变量名 就是 结构体类型+变量名
例如:
struct student s;
结构体初始化
形式:
struct student s={};
初始化的时候,看每个成员变量,他们具体是什么数据类型,然后根据各个成员变量自身的数据类型进行初始化;
初始化的顺序按照定义的顺序,依次初始化;
举例
struct student s={110,"jerry",0,66.6};
还可以用数组初始化
struct student s={{110,"jerry",0,66.6},{111,"tom",0,66.6},{}112,"bruth",0,66.6}};
在这数组里里面的大括号是可以去掉的;
结构体变量的引用
结构体数据引用的时候,一般是引用到具体的成员数据;
引用到成员的运算符是 .(结构体成员运算符);
使用形式:
结构体变量名.成员
它表示询问某个结构体的的成员;
举例
printf("sno = %d\n",s.sno);
printf("name = %s\n",s.name);
printf("sex = %d\n",s.sex);
printf("score = %.2f\n",s.score);
printf函数中使用的s.sno以及其它就是询问结构体的成员;
运算符->
指向结构体成员运算符
用法:结构体指针->成员名
结构体的定义形式
形式1:先定义类型,然后定义变量
struct demo
{
};
struct demo d;
形式2:定义类型的同时定义变量
struct demo
{
}d;
形式3:定义类型的同时定义变量,可以省略结构体名
struct
{
}d;
这种情况一般用在结构体类型只用一次
结构体类型的大小
结构体的对齐规则(内存地址的对齐):
1.在32位的平台上,默认都是按4字节对齐的 ;
2.对于成员变量,各自应该在自己的自然边界上对齐;
3.32位的平台 :如果有超过4字节 ,按照4字节对齐;如果没有超过4字节的,则按成员变量中最大对齐 ;
64位的平台:如果超过4字节的,按超过的最大的成员变量对齐,如果没有超过4字节的,则按成员变量中最大对齐
4.如果成员变量中没有有比4字节大,此时 整个结构体 按照最大的那个成员对齐。
注意:同类型的结构体变量之间,可以相互赋值
struct student s1;
struct student s2;
s2=s1;
qsort函数
函数原型
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
它的功能是排序数组;它的头文件是<stdlib.h>;
其中base是要排序数组的首地址,nmemb是数组元素的个数,size是元素的大小;
int (*compar)(const void *, const void *)
它是比较函数,形参a和b是用来接收要比较的两个数组元素;
举例部分代码
#include<stdio.h>
#include<stdlib.h>
struct student
{
int sno;
char name[30];
float score;
};
int Comparscore(const void *a,const void *b)
{
const struct student *p = a;
const struct student *q = b;
return p->score-q->score;
}
int main(void)
{
struct student s = {{1,a,92},{2,b,93},{3,c,92}};
qsort(s,3,sizeof(s[0]),Comparscore);
}1
此时就是调用了学生数组里面的score进行比较
共用体
(union)它是共用一块内存空间共用了最大成员的空间;
它的语法是
union 共用体名
{
成员变量;
};
代码示例
union demo
{
char a;
short bl;
int c;
};
对比结构体:
结构体中各个成员都拥有自己的独立空间,而共用体中的成员是共用一块内存空间的
用共用体判断大小端
int is LittIeEndian (void )
{
union
{
int a ;
char b;
}d={1};
return d.b;
}
如果返回值是1则说明是小端模式;
总结:
在使用结构体时一定要注意最后面有一个分号,刚开始打的快就容易漏掉,在使用.和->运算符的时候注意两者前面的形式。