枚举、结构体和宏定义
- [ ]
枚举与结构体
枚举与宏定义都是用户自定义的数据类型。根据实际问题需要,定义自己的数据类型,具有很强的灵活性,但要使用好,必须牢记他们的使用规则,尤其是结构体类型,使用比较多。
在结构体变量中,各成员变量都占有自己的内存空间,是同时存在的。一个结构体类型的长度等于所有成员类型长度之和。
一、结构体、枚举有三种定义变量的方法:
1、先定义结构体(枚举类型),在说明结构体(枚举)变量。
#include<stdio.h>
int main()
{
struct stu/*定义结构体变量*/
{
int a;
char b;
float c;
}num1,num2;
enum weekday/*定义结构体变量*/
{sun,mon,tue,wed,thu,fri,sat}m,n;
return 0;
}
2、在定义结构体(枚举)类型的同时说明结构体(枚举)变量。
#include<stdio.h>
int main()
{
struct stu/*定义结构体变量*/
{
int a;
char b;
float c;
};
struct stu num1,num2;
enum weekday{sun,mou,tue,wed,thu,fri,sat};/*定义结构体变量*/
enum weekday m,n;
return 0;
}
3、直接说明结构体(枚举)变量
#include<stdio.h>
int main()
{
struct/*定义结构体变量*/
{
int a;
char b;
float c;
}num1,num2;
enum {sun,mou,tue,wed,thu,fri,sat}m,n;/*定义结构体变量*/
return 0;
}
二、变量赋值
结构体和枚举的相似处还不止如此,变量的赋值也很相似。定义了结构体变量,该变量就也是这种结构。操作结构体变量用"."运算符,如上例,结构体变量赋值:
num1.a=102;
num1.b='A';
num1.c=1.23;
同理枚举变量赋值类似,但是枚举变量有定义类型(int),而枚举量为常量,不能赋值。
m=sun;
n=wed;
会很错误的的给枚举常量赋值
sun=1;
mon=3;
sun=mon;
//这些都是错误的
如果不给变量赋值,枚举值会按0,1,2,3,4····依次被赋值;即
sum=0;
mou=1;
tue=2;
wed=3;
thu=4;
fri=5;
sat=6;
这里有个小套路,在最后一个枚举值后在加一个;即
enum {sun,mou,tue,wed,thu,fri,sat,cnt}//cnt 默认值为7,即前面枚举值的个数
宏
看了结构体,感觉离做一个管理系统又进了一步,枚举类型虽然不怎么好用,但是可以定义一组排比变量,看到枚举的变量让我不仅联想到了了另外一个好朋友:宏。
关于“#”
相信所有初学者都不会不知道“#include<stdio.h>”,这个“#”号开头的是预处理命令,如包含#incude,宏定义#define等。在源程序中这些命令都放在源文件的前面,称之为预处理部分。
宏定义
这里讲的是其中的宏定义。
#define 标识符 字符串/*"#"预处理命令,“define”宏定义命令,“标识符”所定义的宏名,“字符串”可以是常数、表达式、格式串等。
宏定义又分为无参宏定义和带参宏定义,其实就我觉得他们的区别也不是很大,只不过带参宏替换含变量可以用来做“函数”。
下面给出一个无参宏替换和带参宏替换的例子。
#include<stdio.h>
#define x 2//无参替换
#define x 1+1//无参替换
#define f(x) x*x//带参替换
int main()
{
int a,b,c;
a=x*2;
b=x*2;
c=f(2);
printf("a=%d,b=%d,c=%d",a,b,c);
}
猜猜会输出什么,a和b的值2会一样吗?
a=4,b=3,c=4/*b的值告诉我们宏替换没我们想象的那么聪明啊,根据值反推:b=1+1*2;因此宏替换适时要加上“()”。*/
补充一点,竟然宏替换没有那么聪明(只是个普通的搬运工),那么预处理时“字符串”后最好不要加上";"即不要写成这样:
#define 标识符 字符串;
宏定义深究
在Linux终端下
touch 1.c//新建一个文件
vim 1.c//将上面代码输入1.c
//编辑完成后wq保存
gcc 1.c --save temps//编译时保存临时文件
ls//显示当前所有文件
这时,你可以看到出来一个可执行文件a.out以外,还有:
1.i
1.o
1.c
通过命令
tali 1.i
可以看到一下代码
#include<stdio.h>
int main()
{
int a,b,c;
a=2*2;
b=1+1*2;
c=2*2;
printf("a=%d,b=%d,c=%d",a,b,c);
}
可以看见全部预处理的标识符已经被替换了。