应同学请求更新了这篇文章,正好没有水文的借口 (逃
1.前言
在 C 语言中结构体指一种数据结构,是 C 语言中复合数据类型,结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。
与 Java 中的类类似一个结构体看可以看作是一个类别,某类事物的集合体,比如要表示一本书的各种属性(作者,页数,出版时间等),在没有使用结构体的时候,就需要使用各种基本数据类型进行存储,这时会发现在表示数据的时候乱七八糟的,调用的时候也不容易调用,但如果使用了结构体,那结构体名称就可以使用书名表示,书的各种属性就可以放在结构体中,在使用的时候可以很直观的用结构体名称(书名)调用
2.实践
定义结构
在使用结构体的时候需要定义结构体,可以不先定义结构体变量,但必须先定义好结构体的结构
struct tag {
member-list
member-list
member-list
...
} variable-list ;
struct tag {
member-list
member-list
member-list
...
} variable-list ;
- tag : 结构体的标志,可以不设置,但是如果不设置就必须在定义时声明 variable-list,一般使用全大写表示,建议每个结构体都要有 tag
- member-list : 结构中的成员,在定义的时候必须定义结构体中的所有成员
- variable-list : 结构体变量列表,若不声明就必须要有 tag,可以声明多个,使用逗号隔开,也可声明结构体数组
定义时也可以使用 typedef 来创建一个数据类型,下面会针对这两种定义方式进行分析
typedef struct SIMPLE
{
int a;
char b;
double c;
} Simple, *pSimple;
// 我比较喜欢使用这种方式,因为在定义时不需要添加struct,也和Java中的类更加相似
// 不同于结构体,上面三个都是必填项,最后一项不再代表结构体变量,而是代表数据类型
typedef struct SIMPLE
{
int a;
char b;
double c;
} Simple, *pSimple;
// 我比较喜欢使用这种方式,因为在定义时不需要添加struct,也和Java中的类更加相似
// 不同于结构体,上面三个都是必填项,最后一项不再代表结构体变量,而是代表数据类型
嵌套结构体
// 指针式嵌套,可以嵌套自己也可以嵌套别的结构体,但必须声明
struct A
{
struct B *partner;
//other members;
};
// 普通嵌套
struct A
{
struct B partner;
//other members;
};
// 注意:若使用了typedef创建数据类型建议加上struct防止出现不必要的麻烦
// 指针式嵌套,可以嵌套自己也可以嵌套别的结构体,但必须声明
struct A
{
struct B *partner;
//other members;
};
// 普通嵌套
struct A
{
struct B partner;
//other members;
};
// 注意:若使用了typedef创建数据类型建议加上struct防止出现不必要的麻烦
声明结构体变量
结构体变量可以紧跟结构体后创建,不过由于结构体在函数外创建,所以紧跟结构体后声明的结构体变量是全局变量
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
// 这时book就是结构体变量了,可以同基本数据类型一样使用了
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
// 这时book就是结构体变量了,可以同基本数据类型一样使用了
还有一种是在函数中创建
struct Books book;
struct Books book;
使用 typedef 的创建
// 上面我们定义了SIMPLE这个结构体,在创建结构体变量时同基本数据类型一样
// 基本数据类型的定义
// int i;
// 使用typedef的结构体的定义
Simple i; //Simple是在定义结构体的结构时底下的variable-list中的一个
// 上面我们定义了SIMPLE这个结构体,在创建结构体变量时同基本数据类型一样
// 基本数据类型的定义
// int i;
// 使用typedef的结构体的定义
Simple i; //Simple是在定义结构体的结构时底下的variable-list中的一个
创建结构体指针
// 结构体指针在创建时一般会使用malloc来进行开拓内存
// 也可以不开拓,不开拓的话不能访问内部成员
struct Books *book = (struct Books *)malloc(sizeof(struct Books));
// 使用了typedef的结构体创建方式
pSimple sim = (pSimple)malloc(sizeof(Simple)); // 注意定义中pSimple前有一个*,代表结构体指针类型
// 结构体指针在创建时一般会使用malloc来进行开拓内存
// 也可以不开拓,不开拓的话不能访问内部成员
struct Books *book = (struct Books *)malloc(sizeof(struct Books));
// 使用了typedef的结构体创建方式
pSimple sim = (pSimple)malloc(sizeof(Simple)); // 注意定义中pSimple前有一个*,代表结构体指针类型
访问结构体成员
创建好了结构体变量后才能进行访问
// 访问普通的结构体
name.member1
name.member2
// 访问结构体指针中的成员,前提是结构体指针有使用malloc进行创建,否则会报错
name->member1
name->member2
// 结构体数组
name[0].member
name[0]->member
// 访问普通的结构体
name.member1
name.member2
// 访问结构体指针中的成员,前提是结构体指针有使用malloc进行创建,否则会报错
name->member1
name->member2
// 结构体数组
name[0].member
name[0]->member
3.结语
结构体是 C 语言和多种类 C 语言中的一种数据结构,在 Golang,C#,C++都有结构体,但是除了 Golang,其它两种语言都支持面向对象,所以一般很少用到,但是在 C 中它是非常重要的,。。。。。。。。。编不下去了( ̄ ▽  ̄)" (逃
C 结构体的定义和使用
https://blog.ixk.me/post/definition-and-use-of-the-c-struct许可协议
BY-NC-SA
本文作者
Otstar Lin
发布于
2018/12/26
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!