一:宏
宏定义又称为宏代换、宏替换,简称“宏”。
1.宏定义的格式
宏定义的一般格式是:
#define 宏名 宏体
宏名通常用英文大写字母表示。列如:
#define YES 1
宏名如果出现在字符串中,编译预处理不会对它进行替换。例如程序段
char *ps
ps=x==YES; printf(%s\n,ps);
变量ps右边出现的YES不会被置换,输出结果为“x==YES”而不是“x==1”。
2. 宏定义的嵌套
嵌套的宏定义,就是用定义过的宏名去定义另一个宏名。例如:
#define WIDTH 80
#define LENGTH (WIDTH+40)
在第二个宏定义中,使用了前面定义过的宏名WIDTH。在编译预处理时,程序中所有的WIDTH都被80所替换,所有的LENGTH又被(80+40)替换。
3. 宏定义的功能
(1) 定义符号常量:可以提高程序的运行效率
(2) 定义函数
例如:
#define POWER(X) ((X)*(X))
如下是打印0~99的平方的程序
int i;
for (i=0;i<100;i++)
printf(%d ,POWER(i));
易错的一道程序:
#define SQUARE(n) ((n)*(n))
main()
{ int i=1;
while (i<=10)
printf(%d\n,SQUARE(i++));}
运行结果为(2,12,30,56,90)经宏替换后,printf()函数语句被置换为:
printf(%d\n,(i++)*(i++));
4. 宏定义的解除 #undef 宏名
(http://learn.akae.cn/media/ch21s02.html)
二:构造数据类型
2.1结构体
结构体类型的声明
struct 结构体名
{ 成员列表
};
(1)“struct”是C语言的关键字,是结构体类型的标志。
(2)结构体类型的大小是其所有成员所占空间字节数相加之和。(在linux下,由于存在内存空洞,所占字节数要满足字对齐或半对齐)求空间字节数的方法:如下,n=8.注。在linux下,int为4字节,char为1字节。
struct date
{
char a;
int b;
};
int main()
{
struct date k;
int n;
n=sizeof(k);
printf("%d\n",n);
}
(3)花括号外的分号必不可少。
struct date
{ int year,month,day;
}sund;
(4)结构体类型的声明还允许嵌套。如:
struct student
{
int num;
char name[20];
struct date birthday;
}stul;
(5)结构体变量的初始化,所有初值与各成员数据类型要匹配或兼容。
如:struct student stul={1306,“zhouyang”,1989,12,14};
(6)结构体变量的使用:结构体变量名.成员名(实心点是成员运算符,如:sund.year sund.month)。
(7)结构体变量作为函数参数传递的是所有成员的数据。
(8)结构体指针。使用如下:
struct worker
{ int num;
char name[20];
}wk,*pw;
引用结构体元素中的成员:(*pw).num,或pw->num。即是wk.nume。
共同体类型
和结构体有很多相似之处,其主要特点是,共同体变量中的所有成员占用同一段存储空间,这段空间的大小就是所有成员中字节数最大的值。在linux下,要满足字对齐或半对齐。(内存空洞的产生)
枚举类型(enum)
枚举类型就是一一列举出来变量的值,然后此变量就只能使用列举出来的值。
枚举类型定义的一般形式为:enum 枚举名 {枚举值表};
例如:
enum weekday
{ sun,mou,tue,wed,thu,fri,sat };
定义枚举类型变量:enum weekday a,b,c;或
enum weekday
{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
注意点:(1)枚举值是常量,不是变量,不能在程序中用赋值语句再对它赋值。“sun=1; mon=2;”是错误的。
(2)枚举元素本身有系统定义了一个表示序号的数值,从0开始顺序定义为0、1、2、3.....。如sun=0,mon=1.
typedef自定义类型
基本格式:typedef 基本数据类型符 用户自定义数据类型符 (相当于替换)