1 . 结构体的定义
结构体是一个集合,他将不同类型的数据(member)存放在一起,作为一个整体进行处理。
- 定义结构体类型
struct book{
char *name;
int age;
char class;
int *a;
char b[10];//member可为任意c数据结构,也可为另一结构体
}; //分号不能少
此结构体声明(book)仅作为一个描述模板,还未创建一个实际的数据对象
以下创建数据对象
- 定义结构体变量
struct book one;
struct book two;
one two 都为一个可以使用book结构体的结构体变量,其内容与book模板内容一致
- 初始化
struct book one={
"chai",18,'a',2023,"healthy"
};
整体初始化只能在定义结构体变量时,而后只能单个赋值
- 访问member
格式 :<结构体变量名>.<成员名>
如: one.name;
上面说的单个赋值
one.name=“chai”;
- 输出
结构体无法整体输出,只能对member进行访问单个输出
printf(“%s",“%d”,one.name,one.age);
另
- 可以在定义结构体类型的同时定义结构体变量
格式
struct book {
}one;
- 可以直接定义结构体变量
格式
struct {
}one;
注意:此时省略了模板的标记名book,所以这种结构体的定义是一次性的,无法被再次引用
- 访问结构体中的结构体中的结构体…的成员
上面说结构体中的member可以是另一结构体,所以要一路索引到结构体中的结构体中的结构体…的成员,就要
<结构体名>.<结构体中的结构体名>.<结构体中的结构体中的结构体名>…<最终成员名>;
2 . 结构体的整体赋值
对于为同一结构体模板的两个结构体,是可以整体赋值的,有如struct book
one和struct book two
two=one;
3 . 结构体与数组,指针
数组
- 定义
定义结构体类型后,定义一个数组 struct book c[10];
c与[10]结合,c为数组名,此数组申请到十个单元(0到9)的struct book类型的结构体的内存
每一单元都是一个struct book - 初始化
在定义时整体赋值
struct book one[3]={
{"chai",18,'a',2023,"healthy" },
{"lay",18,'a',2023,"healthy" },
{"pigpiece",18,'a',2023,"healthy" }
};
花括号里面的花括号可以省略,每个member用逗号分隔
当对数组中全部元素赋值时,也可以不给出数组长度
- 访问数组结构体的member
one[0].name; //chai
one[1].age;//18
one[2].b[2];//访问第二个单元中b的第2个字符,即a
指针
- 定义
struct book * two;
同样的,two与*结合,是一个指针,指向的类型是一个book模型结构体
two=&one; - 访问
怎么通过two来取得one[1]的一个成员呢?
有运算符->
two++;
two->name;
或(*two).name;
4 . 结构体与函数
可以把结构作为函数参数,传参方式与其他类型的变量或指针类似
void summ(struct book number){}//函数声明
struct books one;//
summ(one);
当调用函数summ时,会根据book模板创建一个自动变量number来接收one的值,所以当将结构体直接作为参数时只能访问不能修改
当要通过函数修改结构体时,可以通过指针传递地址
void summ(struct book *num){num->name="lay";}
struct books one;
summ(&one);
这样one中的name就被修改为lay
若想防止通过指针修改mamber的值,应将指针设置为const
5 . define和typedef
- define
一般格式为#define 宏名(参数表) 被替换的内容
define通过宏定义用一个符号常量来表示一个结构体类型;
#define b struct book
b {
int date;
…
…
};
- typedef
一般格式为;typedef 已有类型 新类型名;
用typedef定义新类型名来代替已有类型名,即给已有类型重新命名;
typedef int i; //i代替Int
typedef struct{
int date;
…
}book;//book代替了该结构体,并保有该模板
book one,two;
没了,其他下辈子再学