结构数组概念
结构数组的每一个元素都是具有相同结构类型的下标结构变量,用来存放大量的结构域相同的结构体变量 。
结构体数组定义:
struct student{
int num;
char name[20];
char sex;
float score;
}stu[5];
一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值所指向的结构变量的首地址。
结构指针变量说明的一般形式:
struct 结构名 * 结构指针变量名
例:
struct car {
int color;
int speed;
};
struct car car1;
struct car *p=&car1;
用结构体指针间接访问结构体变量的成员值
两种方法:
1)(*p).color
(*p).speed
2) p->color
p->speed
结构体嵌套使用
1)成员可以又是一个结构,即构成了嵌套的结构
struct date{
int year;
int month;
int day;
};
struct student {
char *name;
float score;
struct date birthday;
int age;
};
struct student stu={"Fread",98.44f,{2012,12,12},12};
printf("姓名:%s,分数:%.2f,生日:%02d-%02d-%02d,年龄:%d",stu.name,stu.score,stu.birthday.year,stu.birthday.month,stu.birthday.day,stu.age);
2)结构体嵌套自身的指针
struct Person {
char *name;
int age;
struct Person *child;
};
structPerson kim={"kim",8,NULL};
structPerson p1={"林志颖",38,&kim};
printf("%s的儿子是 %s,年龄:%d",p1.name,p1.child->name,p1.child->age);
注意事项:
结构体定义中可以嵌套其他结构体类型的变量
不可以嵌套自己这个类型的变量
结构体指针作为函数的参数
#include <stdio.h>
struct Car {
int lunzi;
int speed;
};
void xiuche(structCar *p){
p->lunzi=2;
int main(int argc,const char * argv[]) {
struct Car car1={4,100};
xiuche(&car1);
printf("%d",car1.lunzi);
return 0;
}
枚举类型
枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型
枚举类型定义的一般形式为:
enum 枚举类型名(枚举值表)
enum color{yellow,rad,blue};
枚举类型变量的定义
1)定义枚举类型的同时定义变量
enum color{yellow,rad,blue}colors;
2)先定义枚举类型后定义变量
enum color icolor;
枚举类型变量的初始化
enum color{yellow,rad,blue}colors;
enum color icolor;
colors=yellow;
icolor=blue;
3)枚举变量的使用
printf("%d",colors);
4)枚举类型定义完成后,系统会自动给枚举的每个元素赋一个整型的初始值,从0开始,依次+1
typedef使用方法
1)基础数据类型
typedef int ZHENGXING;
2)用在数组
typedef int ARR[5];
ARR a={1,2,3,4,5};
3)给结构体起别名
struct person{
char *name;
int age;
};
struct person p1={"wy",24};
typedef struct person P;
P P2={"yw",24};
4)给枚举类型起别名
typedef enum sex{sexMan,sexWoman} ISEX;
5)给函数指针
int (*p)(int,int );
typedef int (*FUN)(int,int );
预处理指令
以#号开头的预处理命令。如包含命令#include,宏定义命令#define等,在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,他们称为预处理命令。
宏的概念及无参宏定义方法
被定义为宏的标示符称为宏名,源程序在编译之前,由预处理程序对我们写的源代码进行处理,会把源程序中所有出现宏名的地方一律使用宏的字符串替换。
宏分为有参数和无参数两种
无参宏的宏名后不带参数,其定义的一般形式为
#define 标示符 字符串
#define M 5
宏使用的注意事项
1)宏是有作用域的
2)在字符串中出现的宏名不会被替换
3)宏可以嵌套使用
#define R 5
#define PI 3.14
#define AREA PI*R*R
4)使用宏起别名
#define INT1 int
int main(int argc, const char * argv[]) {
INT1 a1;
a1=10;
printf("%d\n",a1);
return 0;}
有参宏的定义方法
对带参宏,在调用中,不仅要宏展开,而且要用实参去代替形参
带参宏的定义的一般形式为:
#define 宏名(形参表) 字符串
#define A(a) a+a
有参宏使用注意:
1)宏的形参之间可以出现空格,但是宏名和形参之间不能出现空格
#define A(a ,b) a+b
#define A (a ,b) a+b//错误的
2)有参宏宏的参数最好用括号括起来
#define A(x,y) (x)*(y)+(x)+(y)