C语言中结构与结合的区别

来源:这里教程网 时间:2026-02-16 13:49:22 作者:

C语言中结构与结合的区别

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 structurestruct 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: geeksforgeeksunion data: integer: 18 decimal: 0.00 name: ?sizeof structure: 28sizeof union: 20 Accessing all members at a time: structure data: integer: 183 decimal: 90.00 name: geeksforgeeksunion data: integer: 1801807207 decimal: 277322871721159510000000000.00 name: geeksforgeeks Accessing one member at a time:structure data:integer: 240decimal: 120.000000name: C programming union data:integer: 240decimal: 120.000000name: C programmingAltering a member value:structure data: integer: 1218 decimal: 120.00 name: C programmingunion data: integer: 1218 decimal: 0.00 name: ?

注意:结构比联合更好,因为在联合中共享内存,这导致了一点歧义。但从技术上讲,工会更好,因为他们帮助节省了大量的内存,从而在长期的整体优势超过结构。

相关推荐