网址
分类
通识
状态
已完成
标签
电脑使用
自主学习
用途
类型
上次编辑时间
Jul 9, 2025 08:14 AM
作者
上级 项目
子级 项目
来自:
联系方式:
介绍
本文是c语言关于结构体的有关知识
用法
例:
struct book{char title[MAX];char author[MAX];float value};结构的声明和初始化
1、
struct 结构标记 {成员1类型 成员1类型;......;成员n类型}(变量名);}若无变量名,则为声明结构模板。后续声明变量可直接 struct 已创建结构标记 变量名
2、若已声明模板,可以直接初始化变量(成员内容需与模板顺序一致)
struct 结构标记 变量名={value 1,value 2,...,value n};
3、C99和C11可用初始化器
e.g.struct book surprise={.value =10.99}或
struct book a={.value=20.99, .author="Tom", .title="A Book"};
4、C99可用复合字面量创建临时结构值
(struct book){"Jane","Book of Happiness"};
5、C99可用伸缩型数组成员
①需符合要求:伸缩型数组成员必须是结构的最后一个成员;结构中必须至少有一个成员;伸缩数组的声明类似于普通数组,只是它的方括号中是空的。
下面用一个示例来解释以上几点:
struct flex {int count; double average; double scores[]; // 伸缩型数组成员};
②注意事项:第一,不能用结构进行赋值或拷贝:
struct flex * pf1, *pf2; // *pf1 和*pf2 都是结构*pf2 = *pf1; // 不要这样做
这样做只能拷贝除伸缩型数组成员以外的其他成员。确实要进行拷贝,应使用memcpy()函数。
第二,不要以按值方式把这种结构传递给结构。原因相同,按值传递一个参数与赋值类似。要把结构
的地址传递给函数。
第三,不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。
6、C11可用匿名结构e.g.
访问结构
e.g.
struct book a={.value=20.99,author="Tom",title="A Book"};
可以通过a.value访问结构a的value成员结构数组
1、创建
e.g
struct book library[MAX]
创建了一个叫library的存储book结构元素的数组
2、访问
e.g.library[1].title结构与指针
e.g.
struct book a={.value=20.99,author="Tom",title="A Book"};struct book library[MAX];
1、声明和初始化
e.g.struct book *pt声明了一个指向book结构的指针
初始化:*pt=&book_a或者*pt=library[2]
2、访问
struct book *pt=&a;
用pt->value来通过指针访问a的value成员,它代表的是一个float类型变量
若library[0]=a;*pt=&a;则a.value==library[0].value==pt->value==(*pt).value结构、指针和malloc()
演示
getinfo()把用户的输入读入临时数组中,调用malloc()函数分配存储空间,并把字符串拷贝到新分配的存储空间中。对名和姓都要这样做:
结构与文件
1、使用fread()和fwrite()函数读写结构大小的单元。相同的二进制表示法。例如:
fwrite(&primer, sizeof(struct book), 1, pbooks);
定位到primer结构变量开始的位置,并把结构中所有的字节都拷贝到pbooks相关的文件中。sizeof(struct book)告诉函数待拷贝的一块数据的大小,1表明一次拷贝一块数据。带相同参数的
fread()函数从文件中拷贝一块结构大小的数据到&primer指向的位置。简而言之,这两个函数一次读写整个记录,而不是一个字段。
fread(&library[count], sizeof(struct book),1, pbooks)从pbook指向的文件中读取book类型结构
