1 枚举
定义
枚举是一种用户定义的数据类型,它用关键字enum以如下语法来声明:
enum 枚举类型名字{名字0,名字1,…,名字n};
枚举类型名字通常并不真的使用(可以省略),要用的是在大括号里的名字,因为他们就是int型的常量符号,依次从0到n
也能自定义枚举中的常量值,最后一个可以用来计数,统计前面有几个枚举值
#include <stdio.h>
enum color { GREEN=2,YELLOW,RED=5,NumCLORS };
int main(int argc,char const *argv[])
{
enum color c = 4;
printf("number of RED is %d\n",RED);
printf("number of c is %d\n",c);
printf("number of NumCLORS is %d\n",NumCLORS);
return 0;
}
2 结构
2.1 基本定义
结构的声明
方式一:
struct date {
int year;
int month;
int day;
};
struct date yesterday,today,tomorrow;
yesterday,today,tomorrow都是date结构里面有year,month和day的值
方式二:
struct date {
int year;
int month;
int day;
} yesterday,today,tomorrow;
也可以定义无名的结构
struct {
int year;
int month;
int day;
} yesterday,today,tomorrow;
应用实例
#include <stdio.h>
struct date {
int year;
int month;
int day;
};
int main(int argc,char const *argv[])
{
struct date today;
today.year = 2019;
today.month = 6;
today.day =18;
printf("today is %i-%i-%i\n",today.year,today.month,today.day);
return 0;
}
初始化方式
1、struct date today = {2019,06,18};
2、struct date today = {.year=2019, .day=18}; //没定义的.month是0.
特点:
1、结构里面的变量数据类型可以不一样;
2、使用结构变量名称.结构内成员进行引用,比如date today。
3、today = (struct date){2019,06,18};
yesterday = today;
4、结构名字并不是指针,获取地址时需要加&。
2.2 作为函数参数使用
int Days(struct date today)
·整个结构可以作为参数的值传入函数。
·这个时候是在函数内新建一个结构变量,并复制调用者的结构的值。
·结构可以作为返回值。
注意第二点中结构传入函数中相当是把结构的值拷贝了一份到新的地址区域,生成新的结构变量。在函数内对结构进行的修改并不会影响函数外原有结构里面的值。
当传入大的结构时一般以指针的形式传递更加高效(不需要重新拷贝结构,占用更少内存)
例1
#include <stdio.h>
struct date {
int year;
char *month;
int day;
} today;
int main(int argc,char const *argv[])
{
struct date *p = &today;
(*p).month = "July";
printf("month=%s\n",today.month);
p->month = "August";
printf("next month is:%s\n",today.month);
return 0;
}
例2
#include <stdio.h>
struct point {
int x;
int y;
};
struct point* getstruct(struct point*);
void output(struct point);
void print(const struct point* p);
int main(int argc,char const *argv[])
{
struct point p = {0,0};
struct point* i = &p;
printf("%p\n",i);
printf("%p\n",getstruct(&p));
output(p);
*getstruct(&p) = (struct point){2,3};
print(i); //
return 0;
}
struct point* getstruct(struct point* p){
scanf("%d",&p->x);
scanf("%d",&p->y);
printf("%d %d\n",p->x,p->y);
return p;
}
void output(struct point p){
printf("output %d %d\n",p.x,p.y);
}
void print(const struct point* p){
printf("print %d %d\n",p->x,p->y);
}
注意输出了两次值,而且最后print的是2 3
2.3 构中构
结构数组
struct date dates[100];
struct date dates[]={
{2019,6,18},{2019,11,11},};
结构中的结构
struct dateAndtime{
struct date today;
struct time now;
};
结构就是自定义数据类型相当于数据类型的用法,也就是上面的struct dateAndtime、struct date、struct time这些和int等标准数据类型用法是一样的。
可使用typedef自定义结构名称(可以省略struct),参考链接
https://blog.youkuaiyun.com/Sudley/article/details/94869064
例
#include <stdio.h>
struct date {
int yy;
int mm;
int dd;
};
struct time {
int HH;
int MM;
int SS;
};
int main(int argc,char const *argv[])
{
struct date today = {2019,6,18};
struct time now = {10,11,12};
struct dateAndtime{
struct date today;
struct time now;
};
struct dateAndtime dn = {today,now};
printf("%d/%d/%d %d:%d:%d\n",\
dn.today.yy,dn.today.mm,dn.today.dd,\
dn.now.HH,dn.now.MM,dn.now.SS);
struct dateAndtime* p = &dn;
printf("month is %d\n",p->today.mm);
return 0;
}