前言
当我们在录入大量信息或者需要大量信息时,我们会怎么做?比如说我们要录入小明的成绩,我们可以设置个变量来接收。那如果?小美,小方,甚至全班同学的成绩,甚至他们的语文数学英语成绩,这时候定义的工作量是非常大的,怎么做?我们要一个一个来么?下面介绍三种结构类型让我们的代码更简洁、更工整、更规范。
本篇文章会多次结合黄金矿工的代码,结合我的黄金矿工教程食用效果更佳(我鸽了啊?那没事了~~~~~~)
目录
前言
枚举
结构
声明结构的形式
结构变量的初始化
结构运算
结构指针作为参数
枚举
枚举是一种由用户定义的数据类型,由关键字 enum 来定义
enum name //定义枚举名字
{
xiaoming,
xiaomei,
xiaozhang,
xiaolan
};
要知道的是,枚举量可以作为值。
同数组类似,枚举名字中,xiaoming对应的就是 名字0,xiaomei对应的为名字1,自然,xiaolan对应的为名字3。
这时可以来一个小技巧,我们枚举量过多时,一个一个数枚举量很麻烦,我们只要在枚举后加一个工具枚举量作为下标即可。
下面为黄金矿工部分代码。
enum MINE_TYPE //物品类型枚举
{
GOLD,
MONEY,
STONE,
//方向
LEFT,
RIGHT,
//状态,正常,伸长,缩短
M_NOMAL,
M_LONG,
M_SHORT,
};
枚举实际当中使用深度并不大,因为在C语言之中枚举并不成功,常用来作为排比的名字,比const int更加方便,比宏(macro)好,因为枚举有int类型。
结构
我们可以用枚举来定义一个班级的名字,但是我们怎么处理他们的成绩呢?语文数学英语。
一个一个定义很麻烦,三个还好,如果更多怎么办?物化生政史地......
我们可以用结构来处理这个问题
struct rank {
int chinese;
int math;
int english;
int history;
//等等
};
我们这样就很公整得定义出了这么多的成绩。
怎么用呢?比如我们想输入成绩。
#includestruct rank { int chinese; int math; int english; int history; //等等 }; int main() { //struct rank为变量类型,xiaoming为变量名字。 struct rank xiaoming; xiaoming.chinese = 95; xiaoming.english = 59; xiaoming.math = 20; xiaoming.history = 99; printf("小明语文%i分n小明数学%i分n小明英语%i分n", xiaoming.chinese, xiaoming.math, xiaoming.english); return 0; }
要知道的是,和本地变量一样,在函数内声明的结构只能在函数内使用,所以通常在函数外声明结构类型,这样既可被多个函数使用。
声明结构的形式
1,单纯声明并单独给出变量
struct rank {
int chinese;
int math;
int english;
};
struct point xiaoming,xiaomei;
//xiaoming和xiaomei都是rank
//里面有chinese,math和english的值
2,无名结构,省去了结构类型名字
struct {
int chinese;
int math;
int english;
};xiaoming,xiaomei;
3,第一种和第二种的结合,也是我们最常见的一种。可以同时干两件事。
struct rank {
int chinese;
int math;
int english;
}xiaoming,xiaomei;
结构变量的初始化
怎么给结构变量赋值呢?
和数组与枚举一样,chinese为0,math为1,english为2。
struct rank xiaoming = { 95,20,59 };
struct rank xiaomei = { .math = 100, .english = 100 };
那数组和结构这么像,它们之间有什么不同的地方吗?
定义一个数组之后,数组的每一个变量都为同一个类型。
是int 那么这个数组每一个变量都是int型;
是long 那么这个数组每一个变量都是long型;
是char那么这个数组每一个变量都是char型。
定义结构就相当的宽松了,这个结构里可以有int,可以有char,可以有指针变量,甚至可以有结构,甚至可以有数组,甚至甚至可以有结构里装着结构装着数组装着结构.......
struct azhuizuishuai {
int a;
char b;
int ac[5];
struct ku {
long c;
int* p;
};
};
那么我们现在可以知道,结构是非常自由的,归类会经常用。可以让我们的代码更清晰,更容易访问。
结构运算
可以直接给结构赋值,可以直接给结构赋值
也可以给结构整体进行赋值,取地址,传参数。
struct rank{
int chinese;
int math;
int english;
};
int mian()
{
struct rank xiaoming;定义小明
xiaoming = (struct rank){98,20,59};给小明成绩赋值
struct rank xiaoxiaoming;定义小小明
xiaoxiaoming = xiaoming;//小明成绩赋值给小小明
printf("%in%in%i",
xiaoming.chinese, xiaoming.math, xiaoming.english);
return 0;
}
结构是可以作为函数参数的,延展性很长,本文只作引出
int chengji(struct rank xiaoming)
结构指针作为参数
由于用指针更加轻便,能传结构则不如传一个指针。
指向结构的指针
struct rank {
int chinese;
int math;
int english;
};
struct rank xiaoming;
struct rank * p = &xiaoming;
(*p).chinese = 98;
p->chinese = 98;
->表示指针所指的结构变量的成员
结构数组,只作引出。
struct rank class[40] = {
{55,22,10}{......}{.....}....
}
由于结构和其他知识的嵌套比较复杂,甚至结构与结构的嵌套,后面还需要大家多多练习。
嵌套的结构怎么访问?
如果我们要表示图形的坐标
struct point {
int x;
int y;
};
struct page {
struct point p1;
struct point p2;
};
如果我们要找到点1的x
可以有struct page point x;
那么我们可以有几种方式来访问
如果有下面变量定义:
struct page r, * rp; rp = &r;
我们可以这样来表示
r.p1.x rp->p1.x (r.p1).x (rp.p1).x //但是不可以rp->p1->x(因为p1不是指针)
以上两种定义结构类型我们都进行了初步了解。
剩下来的联合,敬请期待下次更新!
懊恼没有半分意义,珍惜现在的每分每秒
博客持续更新中,啊追也在和大家一起学习



