C语言中的结构是一种用户定义的数据类型,它允许组合不同类型的数据项。结构用于表示一个记录。
定义结构:
要定义结构,必须使用struct语句。struct语句定义了一个新的数据类型,具有一个以上或等于一个成员。struct语句的格式如下:
struct [structure name]
{
member definition;
member definition;
...
member definition;
};
(OR)
struct [structure name]
{
member definition;
member definition;
...
member definition;
}structure variable declaration;
C语言中的Union是C语言中可用的一种特殊数据类型,它允许在同一内存位置存储不同的数据类型。可以定义具有多个成员的联合,但在任何给定时间,只有一个成员可以包含值。联合提供了一种将同一内存位置用于多种目的的有效方法。
定义联合体:
要定义联合,必须以与定义结构相同的方式使用联合语句。联合语句为程序定义了一个具有多个成员的新数据类型。union statement的格式如下:
union [union name]
{
member definition;
member definition;
...
member definition;
};
(OR)
union [union name]
{
member definition;
member definition;
...
member definition;
}union variable declaration;
结构与联合的相似性
- 两者都是用户定义的数据类型,用于将不同类型的数据存储为单个单元。
- 它们的成员可以是任何类型的对象,包括其他结构以及联合或数组。成员也可以由位域组成。
- 结构体和联合体都只支持赋值=和sizeof操作符。赋值中的两个结构或联合必须具有相同的成员和成员类型。
- 结构或联合可以按值传递给函数,也可以按值由函数返回。实参必须具有与函数形参相同的类型。结构或联合是通过值传递的,就像标量变量作为相应的参数一样。
- ”。的操作符或选择操作符,具有最高优先级之一,用于访问用户定义数据类型中的成员变量。
Structure和Union的区别如下表所示,如下表所示:
// C program to illustrate differences
// between structure and Union
#include <stdio.h>
#include <string.h>
// declaring structure
struct struct_example
{
int integer;
float decimal;
char name[20];
};
// declaring union
union union_example
{
int integer;
float decimal;
char name[20];
};
void main()
{
// creating variable for structure
// and initializing values difference
// six
struct struct_example s={18,38,"geeksforgeeks"};
// creating variable for union
// and initializing values
union union_example u={18,38,"geeksforgeeks"};
printf("structure data:\n integer: %d\n"
"decimal: %.2f\n name: %s\n",
s.integer, s.decimal, s.name);
printf("\nunion data:\n integer: %d\n"
"decimal: %.2f\n name: %s\n",
u.integer, u.decimal, u.name);
// difference two and three
printf("\nsizeof structure : %d\n", sizeof(s));
printf("sizeof union : %d\n", sizeof(u));
// difference five
printf("\n Accessing all members at a time:");
s.integer = 183;
s.decimal = 90;
strcpy(s.name, "geeksforgeeks");
printf("structure data:\n integer: %d\n "
"decimal: %.2f\n name: %s\n",
s.integer, s.decimal, s.name);
u.integer = 183;
u.decimal = 90;
strcpy(u.name, "geeksforgeeks");
printf("\nunion data:\n integer: %d\n "
"decimal: %.2f\n name: %s\n",
u.integer, u.decimal, u.name);
printf("\n Accessing one member at time:");
printf("\nstructure data:");
s.integer = 240;
printf("\ninteger: %d", s.integer);
s.decimal = 120;
printf("\ndecimal: %f", s.decimal);
strcpy(s.name, "C programming");
printf("\nname: %s\n", s.name);
printf("\n union data:");
u.integer = 240;
printf("\ninteger: %d", u.integer);
u.decimal = 120;
printf("\ndecimal: %f", u.decimal);
strcpy(u.name, "C programming");
printf("\nname: %s\n", u.name);
//difference four
printf("\nAltering a member value:\n");
s.integer = 1218;
printf("structure data:\n integer: %d\n "
" decimal: %.2f\n name: %s\n",
s.integer, s.decimal, s.name);
u.integer = 1218;
printf("union data:\n integer: %d\n"
" decimal: %.2f\n name: %s\n",
u.integer, u.decimal, u.name);
}
输出:
structure data:
integer: 18
decimal: 38.00
name: geeksforgeeks
union data:
integer: 18
decimal: 0.00
name: ?
sizeof structure: 28
sizeof union: 20
Accessing all members at a time: structure data:
integer: 183
decimal: 90.00
name: geeksforgeeks
union data:
integer: 1801807207
decimal: 277322871721159510000000000.00
name: geeksforgeeks
Accessing one member at a time:
structure data:
integer: 240
decimal: 120.000000
name: C programming
union data:
integer: 240
decimal: 120.000000
name: C programming
Altering a member value:
structure data:
integer: 1218
decimal: 120.00
name: C programming
union data:
integer: 1218
decimal: 0.00
name: ?
注意:结构比联合更好,因为在联合中共享内存,这导致了一点歧义。但从技术上讲,工会更好,因为他们帮助节省了大量的内存,从而在长期的整体优势超过结构。