问题描述:C语言中的结构体可以构造复杂的数据类型。例如有时函数需要传递的参数太多,此时可以考虑用结构体作为参数传入。C语言中的结构体利用函数指针和一般变量可以模拟面向对象语言编程中的属性和方法。结构体的使用非常灵活,下面记录一些结构体使用的较为基础的内容。结构体在其他一些语言中有时被称为记录、字段。

   声明:在花括号中间,每个结构代表一个作用域,可以防止命名冲突,

struct {
int number;
int *ptr;
char name [NAME_LEN + 1];
}part1,part2;

   如果常用到,可以使用类型定义这样声明,

typedef struct {
int number;
int *ptr;
char name [NAME_LEN + 1];
}part_t;
part_t part1,part2;

   还有一种是结构标记声明,

struct part{
int number;
int *ptr;
char name [NAME_LEN + 1];
};
struct part part1, part2;

   初始化:可以在声明的同时初始化,如

part_t   part1 = {22, &item, "Good boy"};   // 这种初始化和数组很相似。

   也可以指定初始化:

part_t   part2 = {.number=33, .ptr=&item1, .name="Another boy"};

   相关操作:

   (1)成员访问,用“.”操作符,如part2.number = 25;

   (2)结构体间赋值,如“part2 = part1;”,直接将结构体part1的内容赋值给了part2,但数组中“array1 = array2;”是不允许的。如果要对数组赋值,可以利用结构体的这个特性,将数组放入结构体中,然后对结构体赋值,则包含在结构体中的数组也会跟着被赋值了。

   (3)作为函数参数传入或返回类型的结构体数据,可以考虑用指针来实现(当然直接用结构体传值是可以的),但是这样做可以避免结构体包含存储空间较大造成副本拷贝需要的空间占用,另外在文件操作中,打开一个文件进行操作,打开文件函数返回的就是一个结构体指针,对该文件的操作用指针即可,可以避免文件副本的重复拷贝。