Skip to content

Latest commit

 

History

History
120 lines (95 loc) · 3.66 KB

ch4_02-C语言结构体.md

File metadata and controls

120 lines (95 loc) · 3.66 KB

C语言结构体

基本类型:整型、浮点型
复合类型:字符串

定义

struct complex_struct{  
    double x,y;
};

定义了标识符 complex_struct,可以看作一个类型名。像 int 或 double 一样。 它是一个复合类型,而我们可以用这个复合类型来定义变量。

1 我们可以先定义一个结构体类型,然后再用这个结构体类型定义变量.(类型定义也是一种声明)

struct complex_struct{
    double x, y;
};

struct complex_struct z1, z2;

2 我们也可以在定义结构体类型时就直接定义变量。

struct complex_struct{
    double x, y;
} z1, z2;   //定义complex_struct型的变量z1 z2。

初始化

初始化,我们可以有多种不同的方式,初始化时,如果{}内的成员比结构体的成员多,那么编译器 将会报错,正确的初始化方式可以有以下几种方法。

double x = 3.0;
struct complex_struct z = { 3.0, 4.0 };   //z.x = 3.0, z.y = 4.0
struct complex_struct z = { .y = 4.0 };   //z.x = 0.0, z.y = 4.0
struct complex_struct z = { x, 4.0, };    //z.x = 3.0, z.y = 4.0
struct complex_struct z = {3.0, };    //z.x = 3.0, z.y = 0.0
struct complex_struct z = { 0 };      //z.x = 0.0, z.y = 0.0

{} 大括号不能用来给结构体变量赋值,我们知道,C89允许在{}中使用常量表达式来初始化, 而用{}括起来的initializer并不属于表达式,所以不能用来赋值。 例如以下的做法是错误的

struct complex_struct z1;
z1 = { 3.0, 4.0 };    //{3.0, 4.0}这种并属于表达式,不能用于赋值

数据抽象

数据抽象简单的说就是"提取公因式":ab + ac = a(b + c)。如果a变了,ab 和ac 这两项都需要 改,但如果写成a(b+c)的形式就只需要改其中一个因子。

数据类型标志

enum coordinate_type { RECTANGULAR, POLAR };
struct complex_struct {
    enum coordinate_type t;
    double a, b;
}

enum 关键字的作用和struct关键字类似,把coordinate_type 这个标志符定义为一个枚举类型。 枚举类型的成员是常量,他们的值由编译器自动分配,例如定义了上面的枚举类型之后,RECTANGULAR 就表示常量0,POLAR表示常量1,如果不希望从0开始分配,可以如下定义

enum coordinate_type { RECTANGULAR = 1, POLAR };    //这样的话,RECTANGULAR就表示1,
                                                    //而POLAR表示2。

结构体的成员名和变量名不在同一个命名空间中,但枚举的成员名却和变量名在同一个命名空间中, 所以会出现命名冲突。 例如 这样是不合法的

int main(void) {
  enum coordinate_type { RECTANGULAR = 1, POLAR };
  int RECTANGULAR;    //这里的整型变量RECTANGULAR的命名 和枚举成员 RECTANGULAR命名
                      //冲突,不能这样写
  printf("%d %d\n", RECTANGULAR, POLAR);
  return 0;
}

查找数据抽象的例子,并思考如何做数据抽象才更加的合理。

嵌套结构体

结构体是一种递归定义,它的成员也具有某种数据类型,而结构体本身也是一种数据类型,也就是 说结构体成员可以是另外一个结构体,也就是说,结构体可以嵌套定义。

struct segment {
    struct complex_struct start;
    struct complex_struct end;
};

初始化时也可以嵌套初始化

struct segment s = {{ 1.0, 2.0 }, { 4.0, 6.0 }};
struct segment s = { 1.0, 2.0, 4.0, 6.0 };
struct segment s = {{ 1.0, 2.0 }, 4.0, 6.0 };
struct segment s = { .start.x = 1.0, .end.x = 2.0 };    //C99特性

访问嵌套结构体的成员:

s.start.t = RECTANGULAR;
s.start.a = 1.0;
s.start.b = 2.0;