设计程序时,最重要的步骤之一就是选择表示数据的方法。在许多状况下,简单变量甚至是数组还不够。为此,C提供告终构变量(structure variable)提升表示数据的能力,它可以创造新的形式。数组
需求:须要打印一份图书目录。里面包含每本书的各类信息:书名、做者、出版社、版权日期和价格。其中一些元素(例如书名和做者)能够储存在字符数组中,其余项目须要一个int或者float。若是使用5哥不一样的数组分别记录每一项都比较繁琐,尤为是要建立多份列表:一份按书名排序、一份按做者排序、一份按照价格排序等。若是能把图书目录的信息都包含在一个数组里更好,其中每一个元素包含一本书的相关信息。函数
所以,就须要一种既能包含字符串也能包含数字的数据形式,并且还要保持各信息的独立。结构体就知足这种状况下的需求。布局
struct Book { /* 结构体模板:标记为Book (咱们一般使用首字母大写的方式来标识结构体) */ char title[128]; // 成员 or 字段 char author[40]; char publisher[256]; int date; float price; } int main (void) { struct Book book; /* 把book声明为一个Book类型的变量 */ printf("请输入书名:"); scanf("%s", book.title); printf("请输入做者:"); scanf("%s", book.author); printf("请输入出版社:"); scanf("%s", book.publisher); printf("请输入出版日期:"); scanf("%d", book.date); printf("请输入价格:"); scanf("%f", book.price); return 0; } // Output 请输入书名:《C Primer Plus》 请输入做者:Stephen Prata 请输入出版社:人民邮电出版社 请输入出版日期:201604 请输入价格:59.4
结构声明(structure declaration)描述了一个结构的组织布局。声明相似下面这样:设计
struct Book { char title[128]; char author[40]; float price; }
该声明描述了一个由两个字符数组和一个float类型变量组成的结构。该声明并未建立实际的数据对象,只描述了该对象由什么组成。code
分析下,首先是关键字struct,它代表跟在其后的是一个结构,后面是一个标记 (例子为Book),咱们可使用该标记引用该结构。因此,咱们能够在后面的程序中这样声明:对象
struct Book book1;
这把book1声明为一个使用Book结构布局的结构变量。排序
在结构声明中,用一对花括号括起来的是结构成员列表。每一个成员都用本身的声明来描述。例如,title部分就是一个内涵128个元素的char类型的数组。成员能够是任意一种C的数据类型,甚至能够是其余结构体。右花括号后面的分号是声明所必需的,表示结构布局定义结束。能够把这个声明放在全部函数的外部,也能够放在一个函数定义的内部。若是把结构声明置于一个函数的内部,它的标记就只限于该函数内部使用。若是置于外部,那么该声明以后的全部函数都能使用标记。字符串
结构有两层含义。一层含义是“结构布局”,结构布局告诉编译器如何表示数据,可是它并未让编译器为数据分配空间。下一步是建立一个结构变量,便是结构的另外一层含义。编译器
struct Book book1; // 建立结构变量
初始化变量和数组以下:it
int count = 0;
int array[7] = {0, 1, 2, 3, 4, 5, 6};
结构变量也能够像这样进行初始化,初始化一个结构变量与初始化数组的语法相似:
struct Book book1 = { "C Primer Plus", "Stephen Prata", 59.4 };
咱们使用在一对花括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。所以,title成员能够被初始化为一个字符串,price能够被初始化为一个数字。为了让初始化项与结构中各成员的关联更加明显,咱们让每一个成员的初始化项都独占同样。这样作只是为了提升代码的可读性,对编译器而言,只须要用逗号分隔各成员的初始化项便可。
结构相似于一个“超级数组”,这个超级数组中,能够是一个元素为char类型,下一个元素为float类型,下一个元素为int数组。能够经过数组下标单独访问数组中的个元素,那么,如何访问结构中的成员?使用结构成员运算符 点 (.) 访问结构中的成员。例如,book1.price即访问book1的price元素。能够像使用任何float类型变量那样使用book1.price。与此相似,能够像使用字符数组那样使用 book1.title。
本质上,.title、.author和.price的做用至关因而Book结构的下标。
因此在初始化结构体变量时,也能够指定成员:
struct Book book1 = {.price = 59.4};
既然已是指定成员赋值了,那么就不用再考虑顺序:
struct Book book1 = { .price = 59.4, .title = "C Primer Plus", .author = "Stephen Prata" }