结构体是一种由内置类型以某种形式(指针、数组、一般形式)结合struct关键字组合在一起描述复杂数据信息的新类型。
声明结构体的一般形式:
struct structName
{
成员表列;
}; // 注意分号
例:声明一个可以描述一本书的书名、版本、价格、出版社信息的结构体
struct bookInfo
{
char name[30];// 书名
char bookConcern[50]; // 出版社
int version; // 版本
float price; // 价格
};
定义变量:
struct bookInfo englishBook; // englishBook包含了书名、版本、价格、出版社信息
*延伸:
声明结构体时定义变量:
struct bookInfo // 可以省略bookInfo结构体名
{
char name[30];// 书名
char bookConcern[50]; // 出版社
int version; // 版本
float price; // 价格
} oneBook, twoBook; // 这种情况下相当于定义了两个变量oneBook、twoBook;
使用typedef:
typedef struct bookInfo // bookInfo可省
{
....
} BOOK; // BOOK等同于struct bookInfo; 定义变量可以直接使用BOOK book;
赋值:
a、定义时直接赋值
struct bookInfo mathBook = {"数学选修", "人民邮电出版社" ,2, 32.5};
* 这种初始化方式要注意声明结构体的成员类型顺序,严格按照成员类型顺序为每个成员的赋值。struct bookInfo的成员类型顺序为char* char* int float。
b、单个成员逐一赋值
struct bookInfo englishBook;
strcpy(englishBook.name, "新概念英语");
strcpy(englishBook.bookConcern, "人民邮电出版社");
englishBook.version = 2;
englishBook.price = 25.2f;
c、部分初始化
struct bookInfo englishBook = {.name="新概念英语"}; // 只初始化书名
struct bookInfo programBook = {.price=45.0f,.bookConcern="人民邮电出版社"}; // 只初始出版社和价格
*这种指定初始化不要求按照成员类型顺序赋值;
*指定初始化必须以.+成员名的形式告诉编译器给哪一个变量赋值;
d、使用另一个结构体赋值
struct bookInfo data1;
struct bookInfo data2 = data1;
struct bookInfo data3;
data3 = data2;
*使用结构体给另一个结构体赋值如果结构体有指针,两个指针指向同一块内存。
定义结构体指针:
struct bookInfo *pBook;
pBook = (struct bookInfo*)molloc(10);
定义结构体数组:
struct bookInfo arrBook[10];
结构体做参数:
void func(const struct bookInfo bki);
void func(const struct bookInfo* pbki);