C 语言中结构体与共用体

结构体(struct)

结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起形成一个新的数据类型,方便程序的编写和管理。

定义结构体

在 C 语言中,定义结构体需要使用 struct 关键字,格式如下:

1
2
3
4
5
cCopy codestruct 结构体名称 {
数据类型1 成员名称1;
数据类型2 成员名称2;
...
};

其中,结构体名称 是结构体的名称,成员名称 是结构体中每个数据成员的名称,可以根据需要自定义。例如,定义一个表示学生信息的结构体:

1
2
3
4
5
cCopy codestruct student {
int id;
char name[20];
int age;
};

上面的代码定义了一个名为 student 的结构体,其中包含三个成员:id(学号,整型)、name(姓名,字符型数组)和 age(年龄,整型)。

访问结构体成员

结构体成员可以使用 . 运算符访问,格式如下:

1
2
cCopy code
结构体变量.成员名称

例如,访问上面定义的 student 结构体的成员:

1
2
3
4
5
cCopy codestruct student s;
s.id = 1001;
strcpy(s.name, "Tom");
s.age = 20;
printf("id=%d, name=%s, age=%d\n", s.id, s.name, s.age);

上面的代码创建了一个名为 sstudent 结构体变量,并分别给其成员赋值。然后,使用 printf 函数输出结构体成员的值。

结构体数组

结构体数组是指由多个相同类型的结构体变量组成的数组,可以通过数组下标访问每个结构体变量,格式如下:

1
2
cCopy code
struct 结构体名称 数组名称[数组长度];

例如,定义一个包含三个学生信息的结构体数组:

1
2
cCopy code
struct student stu[3];

结构体指针

结构体指针是指向结构体变量的指针,可以使用 -> 运算符访问结构体成员,格式如下:

1
2
cCopy codestruct 结构体名称 *指针变量名;
指针变量名->成员名称;

例如,定义一个指向 student 结构体变量的指针:

1
2
3
cCopy codestruct student *p;
p = &s;
printf("id=%d, name=%s, age=%d\n", p->id, p->name, p->age);

上面的代码创建了一个指向 s 结构体变量的指针 p,然后使用 -> 运算符访问结构体成员。

共用体(union)

共用体是一种特殊的数据类型,它可以将不同类型的数据存储在同一块内存空间中,使用 union 关键字定义共用体,格式如下:

1
2
3
4
5
cCopy codeunion 共用体名称 {
数据类型1 成员名称1;
数据类型2 成员名称2;
...
};

其中,共用体名称 是共用体的名称,成员名称 是共用体中每个数据成员的名称,可以根据需要自定义。例如,定义一个包含整型和字符型数组的共用体:

1
2
3
4
cCopy codeunion data {
int num;
char str[20];
};

上面的代码定义了一个名为 data 的共用体,其中包含两个成员:num(整型)和 str(字符型数组)。

访问共用体成员

共用体成员可以使用 .运算符或者 -> 运算符访问,格式和结构体一样。

需要注意的是,共用体成员在内存中占用的空间是相同的,共用体的大小取决于占用空间最大的成员。

共用体与结构体的区别

共用体与结构体都是用户自定义的数据类型,但它们之间有几个重要的区别:

  1. 结构体中的每个成员都占用不同的内存空间,不同成员之间互不影响;而共用体中的成员占用同一块内存空间,不同成员之间共享内存空间。
  2. 结构体的大小取决于所有成员的大小之和,而共用体的大小取决于占用空间最大的成员的大小。
  3. 结构体和共用体在定义时使用的关键字不同,分别是 structunion

使用示例

下面是一个简单的使用共用体的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cCopy code#include <stdio.h>
#include <string.h>

union data {
int num;
char str[20];
};

int main() {
union data d;
d.num = 10;
printf("d.num=%d, d.str=%s\n", d.num, d.str);
strcpy(d.str, "hello");
printf("d.num=%d, d.str=%s\n", d.num, d.str);
return 0;
}

上面的代码定义了一个名为 data 的共用体,其中包含两个成员:num(整型)和 str(字符型数组)。然后,创建一个名为 ddata 共用体变量,并分别给其成员赋值。最后,使用 printf 函数输出共用体成员的值。

注意到共用体成员占用的是同一块内存空间,所以在修改一个成员的值后,另一个成员的值也会相应地发生改变。上面的示例中,先将 d.num 成员赋值为 10,然后使用 strcpy 函数将字符串 "hello" 赋值给 d.str 成员,最后输出 d.numd.str 成员的值,发现 d.num 的值也发生了改变,因为它们占用的是同一块内存空间。

总结

本篇学习笔记介绍了 C 语言中结构体和共用体的定义和使用方法。结构体可以包含多个数据成员,不同成员之间占用不同的内存空间,通过 .-> 运算符访问;共用体中的数据成员占用同一块内存空间,通过 .-> 运算符访问,大小取决于占用空间最大的成员。两者定义时使用的关键字分别为 structunion。需要注意的是,共用体的成员共享内存空间,修改一个成员的值会影响其他成员的值。