#include<stdio.h>enum color{red,yellow,green};voidf(enum color c);intmain(int argc,charconst*argv[]){enum color t=red;scanf("%d",&t);f(t);return0;}voidf(enum color c){printf("%d\n",c);}
#include<stdio.h>intmain(int argc,charconst*argv[]){struct date{int month;int day;int year;};struct date today;
today.month=04;
today.day=24;
today.year=2020;printf("Today's data is %i-%i-%i.\n",today.year,today.month,today.day);return0;}
#include<stdio.h>struct date{int month;int day;int year;};intmain(int argc,charconst*argv[]){struct date today={04,24,2020};struct date thismonth={.month=4,.year=2020};printf("Today's data is %i-%i-%i.\n",today.year,today.month,today.day);printf("This month is %i-%i-%i.\n",thismonth.year,thismonth.month,thismonth.day);return0;}
1.5 结构成员
结构和数组有点像
数组用[]运算符和下标访问其成员
a[0]=10;
结构用.运算符和名字访问其成员
today.day
student.firstName
1.6 结构运算
要访问整个结构,直接用结构变量的名字
对于整个结构,可以做赋值、取地址,也可以传递给函数参数
p1 = (struct point){5,10};
p1=p2;
#include<stdio.h>struct date{int month;int day;int year;};intmain(int argc,charconst*argv[]){struct date today;
today=(struct date){04,24,2020};struct date day;
day=today;
day.year=2019;printf("Today's data is %i-%i-%i.\n",today.year,today.month,today.day);printf("The day's date is %i-%i-%i.\n",day.year,day.month,day.day);return0;}
1.7 结构指针
和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算
struct date *pDate =&today;
(2)结构与函数
2.1 结构作为函数参数
intnumbeOfDays(struct date d)
整个结构可以作为参数的值传入函数
这时候是在函数内新建一个结构变量,并复制调用者的结构的值
也可以返回一个结构
2.2 输入结构
没有直接的方式可以一次scanf一个结构
如果我们打算写一个函数来读入结构(如下)
但是读入的结构如何传送回来呢?
记住C在函数调用时是传值的
所以函数中的p与main中的y是不同的
在函数读入了p的数值之后,没有任何东西会到main,所以y还是{0,0}
#include<stdio.h>struct point{int x;int y;};voidgetStruct(struct point);voidoutput(struct point);intmain(int argc,charconst*argv[]){struct point y={0,0};getStruc(y);output(y);return0;}voidgetStruct(struct point p){scanf("%d",&p.x);scanf("%d",&p.y);printf("%d,%d\n",p.x,p.y);}voidoutput(struct point p){printf("%d,%d\n",p.x,p.y);}
解决的方案
之前的方案,把一个结构传入了函数,然后在函数中操作,但是没有返回去
问题在于传入函数的是外面那个结构的克隆体,而不是指针
传入结构和传入数组是不同的
在这个函数中完全可以创建一个临时的结构变量,然后把这个结构返回给调用者
#include<stdio.h>struct point{int x;int y;};structgetStruct(void);voidoutput(struct point);intmain(int argc,charconst*argv[]){struct point y={0,0};
y=getStruct();output(y);return0;}structgetStruct(void){struct point p;scanf("%d",&p.x);scanf("%d",&p.y);return p;}voidoutput(struct point p){printf("%d,%d\n",p.x,p.y);}
2.3 指向结构的指针
用->表示指针所指的结构变量中的成员
struct date{int month;int day;int year;}myday;struct date *p=&myday;(*p).month =12;
p->month =12;//2.2修改后代码#include<stdio.h>struct point{int x;int y;};structgetStruct(struct point*);voidoutput(struct point);voidprint(conststruct point *p);intmain(int argc,charconst*argv[]){struct point y={0,0};getStruct(&y);output(y);output(*getStruct(&y));print(getStruct(&y));return0;}structgetStruct(struct point *p){scanf("%d",&p->x);scanf("%d",&p->y);return p;}voidoutput(struct point p){printf("%d,%d\n",p.x,p.y);}voidprint(conststruct point p){printf("%d,%d\n",p->x,p->y);}
(3)结构中的结构
struct dateAndTime{struct date sdate;struct time stime;};
三、联合
(1)类型定义
自定义数据类型(typedef)
C语言提供了一个叫做typedef的功能来声明一个已有已有的数据类型的新名字。比如:
//使得Length成为int类型的别名。typedefint Length;
这样,Length这个名字就可以代替int出现在变量定义和参数声明的地方了:
Length a,b,len;
Length numbers[10];
声明新的类型的名字
新的名字是某种类型的别名
改善了程序的可读性
typedefchar*a[] String;typedeflong int64_t;typedefstruct ADate{int month;int day;int year;} Date;
int64_t i=10000000;
Date d ={9,1,2005};
(2)联合
存储
所有的成员共享一个空间
同时只有一个成员是有效的
union的大小事其最大的成员
初始化
对第一个成员做初始化
#include<stdio.h>typedefunion{int i;char ch[sizeof(int)];} CHI;intmain(int argc,charconst*argv[]){
CHI chi;int i;
chi.i=1234;for(i=0;i<sizeof(int);i++){peintf("%02hhx",chi.ch[i]);}printf("\n");return0;}