一、typedef
解释:适用于改变定义名,在程序更复杂时,能做到更灵活
格式:typedef int IOT
typedef int IOT;
IOT a=5;
printf("%d\n",a);//5
typedef float OP;
OP b=1.1;
printf("%f",b);//1.10000
typedef struct{
int a;
}STUDENT;
// 实际上是给
struct{
int a;
};
// 起了别名为STUDENT
二、结构体
1.结构体初始化
解释:结构体里面里面写着基本类型,同时也可以嵌套其它结构体。
struct student{
int age;
int power;
char name[4];
};
2.结构体定义
A:外面定义
struct stu stu1, stu2;
B:初始时定义
struct student{
int age;
int power;
char name[4];
}stu1, stu2;
3.结构体的访问
格式:stu1.age=55;
解释:使用了成员选择运算符号,即’.’
注意:里面字符串数组只能赋值为地址,即stu1.name="abcd"
是错误的因为,“abcd”不是地址,其在电脑也没有地址,可以这样写strcpy(stu1.name,"jack");
。
4.指针对结构体的访问
格式:
struct student stu1;
struct student *p;
p=&stu1;
访问:
A:
printf("%d",(*p).age);
B:
解释:此为成员选择符号
printf("%d\n",p->age);
5.指向结构体的指针做函数参数
区别:直接传递结构体不能进行修改原值,需要指针来进行操作
注意点:
setaiyou(&ay);
取地址符号指向地址struct Aiyou
写在main外面
#include <stdio.h>
#include <stdlib.h>
struct Aiyou
{
int year;
char* name;
char* zdg;
};
void setaiyou(struct Aiyou *aayy)
{
printf("专辑名称:%s,主打歌:%s,发行时间:%d\n", aayy->name, aayy->zdg, aayy->year);
}
int main() {
struct Aiyou ay;
ay.year = 2016;
ay.name = "周杰伦的床边故事";
ay.zdg = "告白气球";
setaiyou(&ay);
return 0;
}
6.跨文件传递结构体指针做函数参数
解释:与5类似,但是值得注意的定义的结构体必须在每个文件里面都要出现,可以把他写入头文件
structA.h
struct student{
unsigned int student_number;
char name[6];
int chinese;
int math;
int english;
};
main.c
#include <stdio.h>
#include <stdlib.h>
#include "structA.h"
void setaiyou(struct Aiyou *aayy);
int main() {
struct Aiyou ay;
ay.year = 2016;
ay.name = "周杰伦的床边故事";
ay.zdg = "告白气球";
setaiyou(&ay);
return 0;
}
appp.c
#include "structA.h"
void setaiyou(struct Aiyou *aayy)
{
printf("专辑名称:%s,主打歌:%s,发行时间:%d\n", aayy->name, aayy->zdg, aayy->year);
}
三、共用体
解释:使用定义与访问与结构体几乎相同
区别:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员;同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉
union student{
int age;
int power;
char name[4];
};
四、枚举体
解释:①里面的值都是整型;②后一个值总比前一个值大1(从0开始);③可以自定义数值的大小;④值不可以改变
enum week{
one,two,three,four,five,six,seven
};//one=0,two=1...
enum week{
one=7,two,three,four,five,six,seven
};//two=8,three=9..
访问:
解释:直接输名就可以
printf("%d",six);