内容纲要
结构体
结构体是C语言中用于存储不同数据类型的构造数据类型
声明
struct 结构名{
成员列表
};
定义
- 先定义结构体类型后定义变量
struct 结构名{
成员列表;
};
struct 结构名 结构体变量名;
- 定义结构体类型同时定义变量
struct 结构名{
成员列表;
} 结构体变量名;
- 直接定义解耦股体类型变量
struct {
成员列表;
} 结构体变量名;
引用
结构体变量名.成员名
如果定义一个结构体指针,使用该指针和结构体名来引用结构体成员
struct{
成员列表;
} *结构体指针名;
(*结构体指针名).成员名
2.
结构体指针名->成员名
结构体数组
struct 结构名{
成员列表;
} 结构体数组名[结构体元素个数];
例如:
#include <stdio.h>
struct{
int age;
} *s, student,students[2];
int main()
{
s=&student;
student.age=18;
students[0].age=16;
students[1].age=17;
printf("student.age=%d,s->age=%d,students[0].age=%d,studnets[1].age=%d",student.age,s->age,students[0].age,students[1].age);
return 0;
}
运行结果:
student.age=18,s->age=18,students[0].age=16,studnets[1].age=17
位域
存储不满足一个字节的数据,要占用几个字节时采用位域的方式来进行存储。位域是把一个字节二进制位划分为几个不同的区域,若当前字节存储不了,可从下一字节开始存储,也可使用空域进行填充,在下一字节处进行存储。
定义:
struct 位域名{
数据类型 位域成员名:所占字节数;
位域成员列表.....
}
使用时与普通结构体一致,位域可以通过各种格式进行输出。
#include <stdio.h>
struct bs{
unsigned int a:8;//0-255 2^8-1
unsigned int b:2;//0-3 2^2-1
int :6;//空域,不使用,可用于填充,让下一位域从下一个字节开始
int c:6;//-32-31
};
int main()
{
struct bs d, *p;
d.a=127;
d.b=3;
d.c=-33;//数据溢出超过位域的范围,极大值溢出从极小值开始,极小值溢出从极大值开始
printf("a=%d,b=%d,c=%d",d.a,d.b,d.c);
return 0;
}
运行结果:
a=127,b=3,c=31
共用体
在一个相同的存储位置存储不同类型的多个值时采用共用体存储。
定义
与结构体的定义引用成员变量方式一样,但是在共用体中只能使用最后一次保存的值,共用体通过覆盖前一成员变量来进行存储,并且在存储过程中与结构体不同。结构体所占用的字节数是其成员变量所占字节数之和,而共用体所占字节数是其成员变量占字节数最大的值。
#include <stdio.h>
union {
int age;
char sex;
} student;
int main()
{
student.age=10;
student.sex='M';
printf("student.age=%d,student.sex=%c,sizeof(student)=%d",student.age,student.sex,sizeof(student));
return 0;
}
运行结果:
student.age=77,student.sex=M,sizeof(student)=4
其中
int
所占字节数最大为4,所以共用体所占的字节数为4。age
成员变量的值为随机数,而sex
的值正确,sex
覆盖了age
的值。
typedef
在C语言中可以使用
typedef
来给系统定义好的数据类型起别名,可以通过别名来定义自定义变量。
typedef 旧类型名 新类型名
#include <stdio.h>
typedef struct {
int age;
char sex;
}STU;
typedef int INTEGER;
typedef char name[10];
int main()
{
STU student;
name a;//相当于char a[10];
return 0;
}
也可以使用宏定义
#define
来进行宏替换,它是由预处理器进行处理的,而typedef
是通过编译器来进行编译的。
留言