struct 结构
C 语言内置的数据类型,除了最基本的几种原始类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型的数据,实际使用中并不够用。
C 语言提供了struct
关键字,允许自定义复合数据类型,将不同类型的值组合在一起。这样不仅为编程提供方便,也有利于增强代码的可读性。C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。
下面是struct
自定义数据类型的一个例子。
struct fraction {
int numerator;
int denominator;
};
上面示例定义了一个分数的数据类型struct fraction
,包含两个属性numerator
和denominator
。
注意,作为一个自定义的数据类型,它的类型名要包括struct关键字,比如上例是struct fraction,单独的fraction没有任何意义,另外,struct语句结尾的分号不能省略,否则很容易产生错误。
如果fraction这个类型名只在当前用一次,可以省略。
定义了新的数据类型以后,就可以声明该类型的变量,这与声明其他类型变量的写法是一样的。
struct fraction f1;
f1.numerator = 22;
f1.denominator = 7;
上面示例中,先声明了一个struct fraction
类型的变量f1
,这时编译器就会为f1
分配内存,接着就可以为f1
的不同属性赋值。可以看到,struct 结构的属性通过点(.
)来表示,比如numerator
属性要写成f1.numerator
。
再提醒一下,声明自定义类型的变量时,类型名前面,不要忘记加上struct关键字。也就是说,必须使用struct fraction f1声明变量,不能写成fraction f1。
除了逐一对属性赋值,也可以使用大括号,一次性对 struct 结构的所有属性赋值。
struct car {
char* name;
float price;
int speed;
};
struct car saturn = {"Saturn SL/2", 16000.99, 175};
和数组赋值方法类似
struct 的数据类型声明语句与变量的声明语句,可以合并为一个语句。
struct {
char title[500];
char author[100];
float value;
} b1;
上面示例中,struct
声明了一个匿名数据类型,然后又声明了这个类型的变量b1
。
与其他变量声明语句一样,可以在声明变量的同时,对变量赋值。
struct {
char title[500];
char author[100];
float value;
} b1 = {"Harry Potter", "J. K. Rowling", 10.0},
b2 = {"Cancer Ward", "Aleksandr Solzhenitsyn", 7.85};
上面示例中,在声明变量b1
和b2
的同时,为它们赋值。
typedef 命令
typedef
命令用来为某个类型起别名。
typedef int antelope, bagel, mushroom;
上面示例中,一次性为int
类型起了三个别名。
typedef经常用在对指针和结构体上面,我们看结构体的例子
typedef struct cell_phone {
int cell_no;
float minutes_of_charge;
} phone;
phone p = {5551234, 5};
这里的phone可不是上面说的那个结构体变量,因为加了typedef这里phone是这个结构体类型的别名相当于int、char这种,后面的p才是结构体变量。