c学习笔记 结构和其他数据形式 20210318

建立结构声明

struct book{
	char title[MAXTITL];
	char author[MAXAUTL];
	float value;
};

关键字struct表明跟在其后的是一个结构, 后面是一个可选的标记,随后程序可使用该标记引用该结构

struct book library;

伸缩型数组成员(flexible array member)(c99)

利用该特性声明的结构其最后一个数组成员有如下特性:

  1. 该数组不会立即存在
  2. 使用该伸缩数组成员可以编写合适的代码, 如同其确实存在且具有所需数目的元素。

声明规则:
1.伸缩型数组必须是结构的最后一个成员;
2. 结构中至少有一个成员;
3. 伸缩数组的声明方括号是空的。

struct flex
{
	int count;
	double average;
	double scores[];       //伸缩型数组成员
}

c99的意图是希望能程序员声明一个指向struct flex的指针, 使用malloc()来进行空间的分配

struct flex *pf;

pf = malloc(sizeof(struct flex) + 5 * sizeof(double));

scores此时表示一个内含5个double类型的数组。
使用指针来进行访问:

pf ->count = 5;
pf -> scores[2] = 18.5;
#include <stdio.h>
#include <stdlib.h>

struct flex
{
	size_t count;
	double average;
	double scores[];
};
void showFlex(const struct flex* p);
int main(void)
{
	struct flex* pf1, * pf2;
	int n = 5;
	int i;
	int tot = 0;

	pf1 = malloc(sizeof(struct flex) + n * sizeof(double));
	pf1->count = n;
	for (i = 0; i < n; i++)
	{
		pf1->scores[i] = 20.0 - i;
		tot += pf1->scores[i];
	}
	pf1->average = tot / n;
	showFlex(pf1);

	n = 9;
	tot = 0;
	pf2 = malloc(sizeof(struct flex) + n * sizeof(double));
	pf2->count = n;
	for (i = 0; i < n; i++)
	{
		pf2->scores[i] = 20.0 - i / 2.0;
		tot += pf2->scores[i];
	}
	pf2->average = tot / n;
	showFlex(pf2);
	free(pf1);
	free(pf2);
	return 0;
}

void showFlex(const struct flex* p)
{
	int i;
	printf("Scores : ");
	for (i = 0; i < p->count; i++)
		printf("%g ", p->scores[i]);
	printf("\nAverage: %g\n", p->average);
}
  1. 伸缩型数组成员不能用用结构进行复制或拷贝
*pf2 = *pf1;

该操作只能拷贝除伸缩型数组成员以外的其他成员, 需要拷贝时应使用memcpy()函数

  1. 不能以按值方式把这种结构传递给结构, 按值传递一个参数与赋值类似, 要把结构地址传递给函数。
  2. 不能使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。

这种类似于在结构中最后一个成员是伸缩型数组的情况称为struct hack, struct hack 还特指大小为0的数组。
struct hack 是针对gcc的, 不属于c标准;
然而伸缩型数组成员方法是标准认可的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值