------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、结构体
数组的元素必须为同一类型,当我们需要将不同类型的数据存放到一起时,数组解决不了问题,这时我们就需要结构体
1.结构体定义:
struct Information {
int age;
int height;
char name[20];
int weight;};
};
这里定义了一个名为Information的结构体,结构体元素包括年龄、身高、姓名、体重,但程序中操作的是结构体变量,所以下面定义一个结构体变量inf
struct Information inf;
定义结构体系统不会给它分配存储空间,当定义结构体变量时才会分配内存空间
2.结构体变量初始化:(注:只能在定义变量的同时进行初始化)
struct Information inf = {25,170,"jack",65};
3.结构体变量的使用:
printf("年龄为%d,身高为%d",inf.age,inf.height);
结构体变量的成员用“结构体变量名.成员名”的方式进行访问
4.结构体数组:
即定义结构体变量时是以一个数组来定义的,数组中每个元素都为该结构体类型
struct Information {
int age;
int height;
char name[20];
int weight;};
}inf[2] = {{25,170,"jack",65},{23,165,"rose",50}};
5.结构体指针:
struct Information inf = {25,170,"jack",65};
struct Information *p = &inf;
访问结构体成员名方法有:
printf("age = %d",(*p).age);
printf("age = %d",p->age);
二、枚举
枚举是C语言中的一种基本数据类型,不是构造类型,当一个变量只能有几个固定的取值时,即可将该变量定义为枚举型,如性别、季节等
1.定义:enum 枚举名{枚举元素1,枚举元素2......};
enum Season {spring,summer,autumn,winter};
enum Season {spring,summer,autumn,winter} s;
enum {spring,summer,autumn,winter} s;
C语言编译器会将枚举元素作为整型常量处理,即依次给每个元素赋值0,1,2……也可以手动赋值:
enum Season {spring,summer = 3,autumn,winter};
赋值后的值依次为0,3,4,5
2.遍历枚举元素
for (s = spring;s<=winter;s++){
printf("枚举元素:\n",s);
}
三、typedef
1.typedef在C语言中用来给各种数据类型取别名,例:
3.用于给结构体取别名:
typedef int i;
typedef float f;
2.用于给指针取别名,例:
typedef char *aaa;
aaa即为一个指向字符型的指针类型
3.用于给结构体取别名:
struct Information {
int age;
int height;
char name[20];
int weight;};
};
typedef struct Information IN;
这里将IN定义为该结构体类型的别名
4.typedef用于给枚举类型取别名,例:
enum Season {spring,summer,autumn,winter};
typedef enum Season S;
S即为该枚举类型的别名四、宏
1.宏定义形式:
#define M 10
其作用是在编译预处理阶段,将程序中的“M”替换成10,也可用于定义有参宏:
#define SUM(a) (a+a)
这里是将“SUM(a)”替换成“(a+a)”,注意这里一般用括号括住字符串的参数和计算结果
2.使用注意:
1)宏名一般用大写字母,以便与变量名区别开来,但使用小写没有语法错误
2)对用双引号括起来的宏字符不进行宏替换操作
3)在编译预处理阶段不作语法检查,只是简单替换,在编译时再进行语法检查
4)宏作用范围从定义到文件结束,若想终止宏作用域,用#undef命令,之后的宏名不再进行宏替换
3.宏与函数的区别
1)宏定义不涉及内存空间的分配、参数类型的分配、参数传递和返回值等问题
2)函数是在程序运行时执行,宏替换是在编译预处理阶段进行,后者执行效率更高
4.typedef和#define的区别:
#define INT int*
typedef int* INT1 ;
INT p1,p2,p3;
INT1 p4,p5,p6;
上面代码中宏替换后INT定义的3个变量中,只有p1是int类型的指针,而INT1定义的3个变量都为int类型的指针,所以,给类型起别名最好使用typedef
五、static和extern
static和extern是用来控制变量或者函数作用域的关键字
1.修饰局部变量
这里需要注意的是extern不能修饰局部变量,static修饰局部变量时,该语句只执行一次,被修饰变量作用域会延长到程序结束
for(int i = 0;i<3;i++){
static int a = 10;
a += 1
printf("%d",a);
}
这里虽然a的初始化在循环内,但它被static修饰,所以初始化只执行一次,打印结果为“111213”
2.修饰全局变量
static int a = 2;
extern int b = 5;
变量a是一个内部变量,只能在本文件中访问与其他文件同名变量互不干扰。而b则是一个外部变量,只要导入上面代码所在头文件,b在本工程下每个文件都可以访问,注意extern不能修饰多个同名变量
3.修饰函数
static修饰函数时,该函数为一个内部函数,只能在文件内部使用。extern修饰的函数为外部函数,只要在使用前进行声明,工程内各个文件都可以访问,但不能有同名的外部函数