【建站服务】阿勒泰爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广-域名申请
作者: 风兰 . 阅读量: 7 . 发表时间:2022-09-21 05:43:18
上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
阿勒泰爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广

C 共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
定义共用体
为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。下面定义一个名为 Data 的共用体类型,有三个成员 i、f 和 str:
union Data
{
int i;
float f;
char str[20];
} data;
现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:
实例
#include <stdio.h>
#include <string.h>
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
printf( "Memory size occupied by data : %d ", sizeof(data));
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Memory size occupied by data : 20
访问共用体成员
为了访问共用体的成员,我们使用成员访问运算符(.)。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。您可以使用 union 关键字来定义共用体类型的变量。下面的实例演示了共用体的用法:
实例
#include <stdio.h>
#include <string.h>
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
data.i = 10;
data.f = 220.5;
strcpy( data.str, "C Programming");
阿勒泰爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站



使用结构数组存储书名/作者,结构体指针访问成员时,也可以对指针解引用再访问,如:*struct_pointer.title;(上面范例)。
#include<stdio.h>#include<string.h>char * s_gets(char*st, int n);#define MAXTITL 40#define MAXAUTL 40#define MAXBKS 100 // 书籍的最大数量struct book { //简历 book 模板 char title[MAXTITL]; char author[MAXAUTL]; float value;};int main(void){ struct book library[MAXBKS]; //book 结构类型数组 int count = 0; int index; printf("请输入书名: "); printf("按下 [enter] 键结束输入。 "); while (count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL && library[count].title[0] != '') { printf("请输入作者: "); s_gets(library[count].author, MAXAUTL); printf("请输入价格: "); scanf("%f", &library[count++].value); while (getchar() != ' ') continue; //清理输入行 if (count < MAXBKS) printf("输入下一本书。 "); } if (count > 0) // 如果数组内有存书籍 { printf("书的列表: "); for (index = 0; index < count; index++) // 遍历已存入的书籍, printf("%s - %s:$%.2f ", library[index].title, library[index].author, library[index].value); // 将内容打印出来 } else printf("没有书。 "); // 否则就打印没书 return 0;}char * s_gets(char * st, int n) //输入文本(作家)函数{ char * ret_val; char * find; ret_val = fgets(st, n, stdin); if (ret_val) { find = strchr(st, ' '); //查找换行符 if (find) //如果地址不是NULL *find = ''; //在此处放置一个空字符 else while (getchar() != ' ') continue; } return ret_val;}qq105677765
105***765@qq.com
hooyubin
hoo***in@gmail.com
对一楼所讲内容的补充:结构体内存大小对齐原则
hooyubin
hoo***in@gmail.com
结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)。即结构体成员的末地址减去结构体首地址(第一个结构体成员的首地址)得到的偏移量都要是对应成员大小的整数倍。
结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在成员末尾加上填充字节。
小小小韩
hhy***2877@163.com
对于案例代码的更改
在Vs 2022上运行访问结构成员-实例代码时候出现了报错
需要将 strcpy 改为 strcpy_s。
#include <stdio.h>#include <string.h>struct Books{ char title[50]; char author[50]; char subject[100]; int book_id;};int main(){ struct Books Book1; /* 声明 Book1,类型为 Book */ struct Books Book2; /* 声明 Book2,类型为 Book */ /* Book1 详述 */ strcpy_s(Book1.title, "C Programming"); strcpy_s(Book1.author, "Nuha Ali"); strcpy_s(Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* Book2 详述 */ strcpy_s(Book2.title, "Telecom Billing"); strcpy_s(Book2.author, "Zara Ali"); strcpy_s(Book2.subject, "Telecom Billing Tutorial");