Introduction

声明结构类型

声明struct person{...};

  • 这个struct person起的作用就是一般声明中的int

    例如:定义struct person类型的变量。struct person ferry, *pferry

  • 声明过程与定义结构变量,可以组合成一个步骤。

1
2
3
4
5
struct /*无结构标记*/
{
int a;
int b;
}library;
  • 但如果要多次使用模板,就要加上标记。

    1
    2
    3
    4
    5
    6
    7
    typedef struct BTNode
    {
    char data;

    struct BTNode* lchild;
    struct BTNode* rchild;
    }BTNode;

这时编译器还没有在内存中分配空间。什么时候开始分配呢,当然是在初始化变量的时候。

初始化结构变量

struct person ferry;这样就初始化了ferry这个变量,同时为该变量分配空间。
当然,我们可以用这结构类型定义多个变量。这样就可以存储不同的信息。

初始化成员

在刚开始声明结构中就有表明了要什么样的数据类型,再到初始化变量的时候分配空间。
而,这些数据类型,就是一个个成员。
有两种方式:

  • 顺序初始化
  • 指定初始化

调用成员

在变量名的后面加 . 然后加上成员变量

顺序初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#define LEN 40
//声明一个标记为Person的结构
struct person
{
char title[40];//声明一个字符数组
int since;
};

int main(int argc, char *argv[])
{

struct person ferry = //声明变量
{//顺序初始化
"ferry", //逗号分隔
2020
};
printf("%s\n", ferry.title);//对结构体成员的引用
printf("%d\n", ferry.since);
return 0;
}
指定初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#define LEN 40
struct person
{
char title[40];/
int since;
};

int main(int argc, char *argv[])
{
struct person ferry =
{
.since = 2020,//指定初始化
.title = "blog"
};
printf("%s\n", ferry.title);
printf("%d\n", ferry.since);
return 0;
}

取别名

为结构体取别名,使用typedef

1
2
3
4
typedef struct complex{
float real;
float imag;
}COMPLEX;

这样就给complex这个结构取个别名COMPLEX。

例如有这样的声明和定义

1
2
3
4
5
6
7
typedef struct {
double x;
double y;
}rect;

rect r1 = { 3.0, 6.0 };
rect r2;

那么就等价于:

1
2
3
4
5
6
7
8
9
10
11
struct 
{
double x;
double y;
}r1 = { 3.0,6.0 };

struct
{
double x;
double y;
}r2;

因为r1和r2是同种类型,r2=r1是对的。没有用typedef就不可以

1
2
3
4
5
6
7
8
9
typedef struct {
double x;
double y;
}rect;

rect r1 = { 3.0,6.0 };
rect r2;

r2 = r1;