Bootstrap

结构体与共用体

结构体

结构体类型—用来描述复杂数据的一种类型,它是构造类型的(用户自定义类型)一种;

声明一个结构体类型

语法:

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则说明是小端模式;

总结:

在使用结构体时一定要注意最后面有一个分号,刚开始打的快就容易漏掉,在使用.和->运算符的时候注意两者前面的形式。

;