P42结构体
结构体声明
-
语法
struct 结构体名称 { 结构体成员1; 结构体成员2; 结构体成员3; ...... }; // 结构体声明只是进行一个框架的描绘,并不会在内存中分配存储空间 // 直到真正定义一个结构体变量的时候,才会在内存中分配空间
-
一本书的结构体声明
struct Book //为了与普通变量名和宏名区分开,使用第一个大写的单词,后面小写 { char title[128]; char author[40]; float price; unsigned int date; char publisher[40]; };
定义结构体类型变量
struct 结构体名称 结构体变量名
-
尝试定义书的结构
-
第一遍自己写
# include<stdio.h> struct Book{ char title[128]; char author[40]; float price; unsigned int date; char publisher[40]; }; int main(){ struct Book book; return 0; }
-
跟着视频写
# include<stdio.h> // 放在外面是全局的,所有函数都可以看到 // 放在main函数里面,只有在main函数才可以对它进行定义 struct Book { char title[128]; char author[40]; float price; unsigned int date; char publisher[40]; }; // 还有另一种定义的方法,在声明的时候定义 /* struct Book { char title[128]; char author[40]; float price; unsigned int date; char publisher[40]; } book; // 这里book是一个全局变量,其他函数也可以对它进行引用和访问 */ int main(void){ struct Book book; // book放在这里,是属于main函数的局部变量 return 0; }
-
-
-
-
访问结构体变量
-
要访问结构体成员,我们需要引入一个新的运算符——点号(.)运算符。比如book.title就是引用book结构体的title成员,它是一个字符数组;而book.price则是引用book结构体的price成员,它是一个浮点型的变量。
-
写一个简单的书籍录入程序
#include<stdio.h> struct Book{ char title[128]; char author[40]; float price; unsigned int date; char publisher[128]; }book; int main(void){ printf("请输入书名 :"); scanf("%s",book.title); //字符数组,直接给名字 printf("请输入作者 :"); scanf("%s",book.author); printf("请输入售价 :"); scanf("%f",&book.price); printf("请输入出版日期 :"); scanf("%d",&book.date); printf("请输入出版社 :"); scanf("%s",book.publisher); printf("\n========数据录入完毕====="); printf("书名: %s\n",book.title); printf("作者: %s\n",book.author); printf("售价: %.2f\n",book.price); printf("出版日期: %d\n",book.date); printf("出版社: %s\n",book.publisher); return 0; }
-
初始化结构体变量
初始化一个变量和数组 int a = 520; int array[5] = {1,2,3,4,5};
-
-
-
初始化一个结构体变量
struct Book book = { "<<带你学C带你飞>>", "小甲鱼", 48.8, 20171111, "清华大学出版社" };
-
初始结构体的指定成员值
-
其语法和数组指定初始化元素类似,不过结构体指定初始化成员使用点号(.)运算符和成员名。
-
数组使用方括号和下标值。
-
比如我们可以让程序只初始化Book的price成员:
struct Book book = {.price = 48.8}
-
还可以不按结构体声明的成员顺序进行初始化:
struct Book book = { .publisher = "清华大学出版社", .price = 48.8, .date = 20171111 };
-
-
算一算
#include<stdio.h> int main(void){ struct A{ char a; int b; char c; } a = {'x',520,'o'}; printf("size of a = %ld\n",sizeof(a)); return 0; } /* 结构体成员名叫a,和结构体变量名叫a,是不会冲突的。 可以同名。错误答案 : 6 结果 : size of a = 12 编译器对结构体的成员进行内存对齐后的结果,内存对齐,就是让CPU可以更快地处理和读取数据 的一个方式。所有的数据都会进行内存对齐 对于32位系统来说,它的对齐系数通常是4个字节。*/
-
把结构体稍作修改
# include<stdio.h> int main(){ struct A{ char a; char c; int b; } a = {'x','o',520}; printf("size of a = %ld\n",sizeof(a)); return 0; } /* size of a = 8