枚举是一种用户定义的数据类型,它用关键字enum以如下语法来表明:
enum 枚举类型名字{名字0,……,名字n};
枚举类型的名字通常并不使用,要用的是大括号里的名字,它们是常量符号,
他们的类型是int,值则依次从0到n。如:`enum colors{red,yellow,green};`
就是指创建了三个常量,red值为0,greed值为2。
struct date{
int month;
int year;
}; //这个分号最容易忘记
struct date today; //给这个结构取个名字
today.month = 05; //给结构中的某个变量赋值
printf("Today's month is %i.\n",today.month);
// 1.p1和2都是point,里面有x和y的值。
struct point{
int x;
int y;
};
struct point p1,p2;
// 2.p1和p2都是一种无名结构,里面有x和y。
struct {
int x;
int y;
} p1,p2;
// 3.p1和p2都是point,里面有x和y的值。 (最常见)
struct point{
int x;
int y;
} p1,p2;
// 对于第一和第三种形式,都声明了结构point。
// 但是第二种形式没有声明结构point,只定义了两个变量。
p1=(struct point){5,10};
相当于p1.x=5; p2.y=10;p1 = p2;
相当于p1.x=p2.x; p1.y=p2.y;和数组不同,结构变量的名字并不是结构变量的地址,所以必须
使用&运算符获取地址:`struct date *pDate = &today;`
int numberOfDays(struct data d)
我们将一个结构传入了函数,然后在函数中操作,但是没有返回;
传入结构和传入数组是不同的,它传入的是外面那个结构的克隆体,而不是指针。
所以我们可以创建一个临时变量,然后把这个结构返回给调用者。
struct data {
int month;
int day;
} myday;
struct data *p = &myday;
(*p).month = 12; //符号较多,简写为下一行
p->month = 12; //读作arrow,p所指的month
可以自定义结构的类型。
struct time testTimes[3] = {{8,27,25},{11,0,0},{5,12,34}};
strcut rectangle {
struct point pt1;
struct point pt2;
};
如果定义这样一个变量:
struct rectangle r,*rp;
rp = &r;
则下面这四种形式是等价的:
r.pt1.x (r.pt1).x rp->pt1.x (rp->pt1).x
但是没有rp->pt1->x,(因为pt1不是指针)。
C提供typedef的功能来声明一个已有的数据类型的新名字,
比如`typedef int Length`,使得Length成为int类型的别名。
这样,Length可以代替int出现在变量定义和参数声明啦。
`Length a,b,len;`,`Length numbers[10];`。
主要用于给复杂的struct定出名字。
typedef struct{
int day;
int year;
} data;
最后面的data是这个结构的名字。
printf("in fun %s name=%d\n",__func__,gWord);
#define <名字> <值>
#define _DEBUG
__LINE__
%d 所在行数__FILE__
%s 所在文件的全路径__DATE__
%s 日期__TIME__
%s 时间__STDC__
判断是否为标准C程序基本原则:一切都要括号
可以带多个参数、求出较小值: