结构体:
1.含义:
是一组具有某种关联的,但是数据类型不一致的一个集合
2:如何定义结构体
格式:
常规定义方式:
struct StrName{
var 1;
var 2;
};
#define :本质是替换,前面指代后面
#define N 30
#define q int*
typedef:一般用在对类型的定义,后面指代前面的类型
typedef int int32;
typedef unsigned int uint32;
typedef int* p;
int32 a,b,sum;
int a,b,sum; 等价的
p k,r;//定义两个指针变量
q m,n;
(int *) k,r;
int * m,n;
替换定义方式(偷懒)
typedef struct Person{
int age;
char gender;
float high;
}person;
无结构体名定义方式
struct{
int age;
char gender;
}s1,s2,s3;
缺点,无法再一次定义变量,不建议大家使用
3.如何定义结构体变量
a.struct Person{
var 1;
var 2;
};
定义:struct Person + 变量名
struct Person s1,s2,s3;
typedef struct Person{
int age;
char gender;
float high;
}person;
person d1,d2,d3;建议使用这种方式
b.struct Person{
var 1;
var 2;
}s1,s2,s3;
错误点:经常忽略(;)
4.如何初始化结构体成员
typedef struct Person{
char name[20];
int age;
char gender;
}person;
char name[20]={};
char name[20]="hello";
方式一:peson s1={"furong",18,'W'}; //初始化
方式二:person s2; //赋值
s2.name="xizong";//error
strcpy(s2.name,"xizong");
s2.age=18;
s2.gender='M';
5.如何引用结构体成员
typedef struct Person{
char name[20];
int age;
char gender;
}person;
结构体变量名+(.)+成员名
person s1;
s1.name
s1.age
s1.gender
练习:定义一个结构体名字叫做Class,成员自给,并且附上初值,打印
6.结构体长度
结构体的不齐
在32bit的系统中,结构体成员默认按照4字节不齐,但是如果最大字节数低于4个字节,按照最大
字节数补齐
7.结构体数组
定义结构体数组
typedef struct Person{
char name[20];
int age;
char gender;
}person;
person a[3]={{"zhangsan",20,'M'},{"mazi",29,'W'},{"wangwu",88,'W'}};//初始化
a[0].name="furong";//error
a[1].name="guoer";//error
a[2].name="xiaolongnv";//error
strcpy(a[0].name,"guoer");
a[0].age=30;
a[0].gender='M';
8.结构体指针/结构体指针分配空间
typedef struct Person{
char name[20];
int age;
char gender;
}person;
自动分配空间
person s;
person *p1=&s;
手动分配空间
person *q=malloc(28);
person *q=malloc(sizeof(person));
如何引用结构体成员
q->name
变量名+(->)+成员名
假如在结构体内部定义指针,那么一定要给这个指针分配一定的空间,最后也要手动销毁
给字符串指针赋值时建议采用strcpy()函数
如果定义了结构体指针,将指针向下偏移一个单位(p+1),那么它的地址偏移了整个结构体的
长度,到了结构体的末尾
9.结构体作为参数/返回值
建议大家使用结构体指针作为参数和返回值
10.结构体嵌套
结构体内部还可以定义结构体
typedef struct Person{
char name[20];
int age;
struct Class{
char gender;
float grade;
}s1;
}person;
11.联合体union
不同的数据使用相同的内存空间,使用时注意,一次只能使用一个成员,便于节省空间
union unionName{
var 1;
var 2;
};
typedef union Stu{
var 1;
var 2; 2
}stu;
stu s1;
在union嵌套于结构体中算结构体长度时,只算union成员中类型较大的一个类型
警告:如果同时使用,后果不堪设想!
12.枚举enum
定义方式
enum enumName{
monday,tuesday,wednesday,thursday,friday,saturday,sunday
};
枚举中的成员,默认从0开始一次递增
我们可以认为的改变成员的值
小结:结构体、联合体以及枚举这部分内容主要熟练结构体的使用,结构体是链表的基础。对于联合体与枚举,只需了解它们的特点及用法即可