结构类型
枚举
枚举是用户定义的数据类型,用来表示依此排列的常量(常量类型只能是 int,常量大小是从0到n)
枚举类型里的名字通常不是真的使用,要使用的是大括号里的常量名字。定义枚举的意义就是给这些常量定义一些名字
enum colors {red,yellow,green}; //red=0...
void f(enum color c);
int main()
{
enum color t =red; //enum color作为一个整体,是一种数据类型,相当于int t =red,告诉编译器这个red是color这个枚举类型
f(t);
return 0;
}
void f(enum color c)
{
printf("%d\n",c);
}
//枚举也可以自定义常量
enum colors{RED,YELLOW,GREEN=5}; //此时RED=0,YELLOW=1,GREEN=5
结构体
自定义的复合的数据类型,在一个数据类型中有多种不同的类型
结构体放在所有函数的外面时,可以被所有函数使用;放在某个函数里面时,只能在那个函数的内部使用。
- 声明结构体
//定义方式1
struct point{
int x;
int y;
}; //别忘了最后的分号
struct point j; //变量j的数据类型是point
j.x = 1;
j.y = 2; //给j中的变量赋值
//定义方式2
struct point{
int x;
int y;
}j; //将上述的两步写在了一起
//方式3
struct {
int x;
int y;
}j; //无名结构体,这样写就不能用此结构体来定义新变量了,仅适用于只想使用一次的结构体
//结构体赋初值
struct point j = {100,2}; //j.x=100,j.y=2;
struct point j = {.x=100,.y=2}; //如果没有指定的值会默认0
p1 = (struct point){10,2}; //强制类型转换 相当于初始化p1.x=10..
p2=p1; //初始化p2.x=10..
//定义一个指向结构体的指针
struct point *p_point = &j; //定义指针时给出指针的类型。
//定义结构类型
typedef struct _point{
int x,y;
}Point;
Point j; //将结构他定义为一个新的类型,就不用每次都打一个struct了
- 结构体可以作为参数传入函数:在函数内部新建一个结构变量,将传入的结构变量复制进去,这与数组完全不同(数组是传入的数组就是个指针,跟原数组一样)
结构体也可以作为返回值返回。
//想要使函数中对传入结构体的值进行保存
//返回结构体
struct point{
int x;
int y;
};
struct point getStruct(void){
struct point p; //结构体定义在函数外,所以在函数体内可以用
scanf("%d",&p.x);
scanf("%d",&p.y);
return p;
}
int main(void)
{
struct point y={0,0};
y = getStruct();
}
//传入指针
//更加有效,因为上述方法是传值,要为新的函数内的结构体里的结构类型开辟一个内存空间,然后将传入的参数一个个复制过去,占空间耗时间,所以大的结构体不推荐传值
struct point *p = &j;
(*p).x=100; //*p就是j 相当于j.x
p->x=100; //两者等价,->就是结构变量中的成员,箭头的左边只能是指针!
struct point getStruct(struct point *p){
scanf("%d",&p->x);
scanf("%d",&p->y);
return p; //返回指针,好处:可以在其它函数中调用这个返回值
}
void output(struct point p)
{
printf("%d,%d",p.x,p.y);
}
output(*getStruct(&y)); //y是一个point类型的结构体,&y是结构体地址,相当于指针的值,getStruct(&y)是返回的那个指针p,*p就是取结构体里的值
- 结构体数组
struct point studentsPoint[3] = {
{99,100}, {60,50}, {70,85}
}; //定义了一个结构体数组
printf("%d,%d",studentsPoint[0].x,studentsPoint[0].y); //就会显示99和100
- 结构体的嵌套
struct rectangle {
struct point point1;
struct point point2;
}
struct rectangle rec;
rec.point1.x=1;
rec.point2.y=2;
//嵌套再加数组
struct rectangle rects[]{
{ {1,0},{2,1} },
{ {2,2},{2,3} }
};
rects[0].point1.x //就是1
rects[0].point1.y //就是0 就是最里面那个小括号,右边那个小括号就是rects[0].point2.x和Y