程序清单14.1 book.c
/*book.c---结构体示例程序:创建一个图书目录*/
#include
#define MAXTITL 41
#define MAXAUTL 31 //宏定义书名和作者名的最大长度
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
int main(void)
{
struct book lib;
printf("请输入图书名称\n");
gets(lib.title);
printf("请输入作者名字\n");
gets(lib.author);
printf("请输入图书价格\n");
scanf("%f",&lib.value);
printf("%s写作的%s价格是$%.2f\n",lib.author,lib.title,lib.value); //注意结构体成员的访问
//方式与数组类似不必连续
return 0;
}
使用结构体必须掌握一下三点内容:
1,建立结构体的格式(或布局);
2,声明遵循该布局的变量;
3,获取对一个结构变量的各个部件的访问。
struct book {
char a;
int b;
float c
char name[100];
};//程序至此并未进行任何实际对象的创建,仅仅构建了一种数据类型的集合
struct book x;//至此创建了一类数据 与 int x;类似 struct booky ≈ int
//是一种类型的描述 只不过book是自己构建的类型 int是C提供的类型
结构的定义分为带标记和不带标记两种情况:
1,
struct book {
char a;
int b;
float c
char name[10];
};
stuct book lib;
2,
struct {
char a;
int b;
float c
char name[100];
} lib;
//程序1和程序2完成了同样的动作即定义了一个包含四个元素的结构体变量lib
14.3.1 结构体的初始化
struct book lib={
a1;
100;
66.4;
name[10];
}
//注意类型需要同声明时向对应
14.3.2 访问结构体成员
结构体成员的访问不需要按顺序访问,访问方式与数组类似,可以进行对应元素寻址操作。具体使用方式在程序清单14.1中已示范。
直接翻译:结构体组成的数组(参照整型数组理解),无需多说。
程序清单14.2 manybook.c
/*manybooks.c--包含多本书的图书目录*/
#include
/*
宏定义最大长度
书名:MAXTL
作者名: MAXAU
书的数量:MAXNUM
*/
#define MAXTL 40
#define MAXAU 40
#define MAXNUM 100
struct book {
char title[MAXTL];
char author[MAXAU];
float value;
};
int main(void)
{
struct book lib[MAXNUM];//定义一个结构数组元素是book类型
int count = 0;
int index;
printf("在书名输入处输入1+回车退出\n");
printf("请输入书名:");
while(count 0)
{
printf("下面将按顺序打印您输入的图书信息\n");
for(index = 0;index < count;index++)
{
printf("第%d本图书\n",(index + 1));
printf("%s所著《%s》价格是%.2f\n\n\n",lib[index].author,lib[index].title,lib[index].value);
}
printf("打印完毕,共打印了%d本书\n",count);
}
else
{
printf("未输入图书信息\n");
}
return 0;
}
请看下列四行代码:
lib; //book结构数组
lib[2]; //数组元素2
lib[2].title //数组元素2的结构体成员title
lib[2].title[2];//数组元素2的结构体成员title的第二个字符
程序清单14.3 friend.c
/*friend.c--结构嵌套示例*/
#include
#define LEN 20
const char *msgs[5]={"谢谢你的晚餐",
"你真是一个称职的",
"坚决不赢球",
"你的球技就像你最喜欢的食物",
"一样!!!"
};
struct names{
char first[LEN];
char last[LEN];
};
struct guy{
struct names hadele;
char* favfood;
char* job;
float income;
};
int main()
{
struct guy fellow={
{"李","四"},
"臭豆腐",
"中国男足运动员",
58112.00
};
printf("亲爱的%s%s:\n\n",fellow.hadele.first,fellow.hadele.last);
printf("%s%s%s,",fellow.hadele.first,fellow.hadele.last,msgs[0]);
printf("%s%s\n",msgs[1],fellow.job);
printf("%s",msgs[2]);
printf("%s%s%s\n",msgs[3],fellow.favfood,msgs[4]);
return 0;
}
程序14.4 friends.c 将会展示如何定义一个指向结构体的指针并且如何使用该指针访问结构体成员。
程序清单14.4 Cuboid_volume.c 通过计算一个长方体体积了解指向结构的指针。
/*Cuboid_volume.c--计算长方体的体积*/
#include
struct cbuoid_msgs{
float length;
float width;
float height;
};
int main(void)
{
struct cbuoid_msgs cbuoid_msg1[2]={
{2.0,
3.0 ,
4.0 },//结构体数组第一个元素
{1.0,
3.0 ,
4.0 }//结构体数组第二个元素
};
struct cbuoid_msgs *ptr_cuboid1;//指向 结构体cbuoid_msgs类型 的指针声明
printf("第一个元素地址:%p\n第二个元素地址:%p\n",&cbuoid_msg1[0],&cbuoid_msg1[1]);
ptr_cuboid1=&cbuoid_msg1[0];//给指针赋值 内容是结构数组的第一个元素
printf("指针地址:%p\n指针加1后的地址:%p\n",ptr_cuboid1,ptr_cuboid1+1);
/*访问结构题的两种方式展示如下:*/
printf("第1个长方体的体积是%.2f:\n",(*ptr_cuboid1).length*(*ptr_cuboid1).width*(*ptr_cuboid1).height);
ptr_cuboid1++;//使指针指向结构数组的下一元素
printf("第2个长方体的体积是%.2f:\n",ptr_cuboid1->height*ptr_cuboid1->length*ptr_cuboid1->width);
return 0;
声明很简单:struct cbuoid_msgs *ptr_cuboid1;
特别注意:必须把明确的地址赋给该指针,此处与数组指针和函数指针不同。
访问成员的两种方式已经在程序清单14.4中详细展示。推荐使用第二种。
程序清单14.5 Cuboid_volume1.c
/*
Cuboid_volume1.c
--计算一个三角形的面积
--长方体的长宽高作为结构体成员
--展示向函数传递结构体信息的三种方式
1,传递成员
2,传递指针(地址)
3,传递整个结构
*/
#include
struct cbuoid_msgs{
float length;
float width;
float height;
};
float calc_cbuoid_volume1(float , float , float);
float calc_cbuoid_volume2(const struct cbuoid_msgs* );
float calc_cbuoid_volume3(const struct cbuoid_msgs);
int main(void)
{
struct cbuoid_msgs cbuoid_msgs1 = {
1.0,
2.0,
3.0
};
printf("传递成员方式结果:%.1f\n", calc_cbuoid_volume1(cbuoid_msgs1.length ,
cbuoid_msgs1.width ,
cbuoid_msgs1.height));
printf("传递指针方式结果:%.1f\n", calc_cbuoid_volume2(&cbuoid_msgs1));
printf("传递结构体方式结果:%.1f\n", calc_cbuoid_volume3(cbuoid_msgs1));
return 0;
}
float calc_cbuoid_volume1(float a , float b , float c) //此函数示范传递结构体成员
{
return (a * b * c);
}
float calc_cbuoid_volume2(const struct cbuoid_msgs* ptr) //此函数示范传递指向结构的指针
{
return (ptr->length*ptr->width*ptr->height);
}
float calc_cbuoid_volume3(const struct cbuoid_msgs stru) //此函数示范传递结构体
{
return (stru.length * stru.width * stru.height);
结构可以赋值给其它结构:
struc_a=struc_b;//如果赋值符号左右两端是类型相同的结构题则该语句是成立的
有了这个特性后就可以将结构作为函数值返回(注意数组不能作为返回值的原因是数组不能相互之间赋值)。
程序清单14.9 传递和返回结构
/* Cuboid_volume1.c -- 展示指针传递和返回 */
#include
struct cbuoid_msgs{
float length;
float width;
float height;
};
struct cbuoid_msgs getinfo(void);
struct cbuoid_msgs makeinfo(struct cbuoid_msgs);
void showinfo(struct cbuoid_msgs);
int main (void)
{
struct cbuoid_msgs cbuoid_msgs1;
cbuoid_msgs1 = getinfo();
cbuoid_msgs1 = makeinfo(cbuoid_msgs1);
showinfo(cbuoid_msgs1);
return 0;
}
struct cbuoid_msgs getinfo(void)//从键盘获得长方体的长宽高
{
struct cbuoid_msgs msgs_buf;
printf("请输入长\n");
scanf("%f", &(msgs_buf.length));
printf("请输入宽\n");
scanf("%f", &(msgs_buf.width));
printf("请输入高\n");
scanf("%f", &(msgs_buf.height));
return msgs_buf;
}
struct cbuoid_msgs makeinfo(struct cbuoid_msgs temp)
{
printf("您输入的高是%.2f\n",temp.height);
printf("您输入的宽是%.2f\n",temp.width);
printf("您输入的长是%.2f\n",temp.length);
return temp;
}
void showinfo(struct cbuoid_msgs cbuoid_msgsx)
{
printf("您输入的长方体计算后体积是%.2f\n",cbuoid_msgsx.height *
cbuoid_msgsx.length *
cbuoid_msgsx.width);
}
2019年4月1日 23:56:52 未完待续 P395