当涉及到C语言结构体的高级**时,有很多有趣和强大的技巧可以应用。下面是10个例子代码,每个例子都使用了不同的高级结构体技术,包括位字段、嵌套结构体、联合体、指向结构体的指针等。让我们逐个来讲解这些例子代码。 - #include <stdio.h>
- struct Flags {
- unsigned int flag1 : 1;
- unsigned int flag2 : 2;
- unsigned int flag3 : 3;
- };
- int main() {
- struct Flags f;
- f.flag1 = 1;
- f.flag2 = 2;
- f.flag3 = 3;
- printf("Flag 1: %d\n", f.flag1);
- printf("Flag 2: %d\n", f.flag2);
- printf("Flag 3: %d\n", f.flag3);
- return 0;
- }
在这个例子中,我们使用了位字段来定义一个结构体,其中每个成员变量都指定了所占用的位数。这样可以有效地使用内存,并在结构体中存储多个布尔标志或其他具有限定范围的值。 - #include <stdio.h>
- struct Date {
- int day;
- int month;
- int year;
- };
- struct Person {
- char name[20];
- struct Date birthdate;
- };
- int main() {
- struct Person p;
- strcpy(p.name, "John Doe");
- p.birthdate.day = 1;
- p.birthdate.month = 1;
- p.birthdate.year = 1990;
- printf("Name: %s\n", p.name);
- printf("Birthdate: %d/%d/%d\n", p.birthdate.day, p.birthdate.month, p.birthdate.year);
- return 0;
- }
在这个例子中,我们定义了一个Date结构体,它包含了日期的日、月和年。然后,我们在Person结构体中嵌套了Date结构体,以表示一个人的姓名和出生日期。 - #include <stdio.h>
- union Data {
- int i;
- float f;
- char str[20];
- };
- int main() {
- union Data data;
- data.i = 10;
- printf("Data as integer: %d\n", data.i);
- data.f = 3.14;
- printf("Data as float: %f\n", data.f);
- strcpy(data.str, "Hello");
- printf("Data as string: %s\n", data.str);
- return 0;
- }
联合体允许在同一块内存空间中存储不同类型的数据。在这个例子中,我们定义了一个Data联合体,它可以存储整数、浮点数和字符串。通过更改联合体的成员,我们可以以不同的方式解释相同的内存块。
- 指向结构体的指针(Pointers to Structures)
- #include <stdio.h>
- struct Point {
- int x;
- int y;
- };
- void printPoint(struct Point *p) {
- printf("Point coordinates: (%d, %d)\n", p->x, p->y);
- }
- int main() {
- struct Point p;
- struct Point *ptr;
- p.x = 10;
- p.y = 20;
- ptr = &p;
- printPoint(ptr);
- return 0;
- }
在这个例子中,我们定义了一个Point结构体来表示二维平面上的一个点。然后,我们声明一个指向Point结构体的指针ptr,并将其指向结构体变量p。通过指针,我们可以直接访问结构体的成员,并将指针传递给函数以操作结构体。
- 结构体的自引用(Self-referential Structures)
- #include <stdio.h>
- struct Node {
- int data;
- struct Node *next;
- };
- int main() {
- struct Node node1, node2, node3;
- node1.data = 10;
- node2.data = 20;
- node3.data = 30;
- node1.next = &node2;
- node2.next = &node3;
- node3.next = NULL;
- struct Node *current = &node1;
- while (current != NULL) {
- printf("Data: %d\n", current->data);
- current = current->next;
- }
- return 0;
- }
这个例子展示了结构体的自引用,其中每个结构体节点包含一个数据成员和一个指向下一个节点的指针。通过链接多个节点,我们可以创建链表的数据结构。
- 函数指针成员(Function Pointer Members)
- #include <stdio.h>
- struct MathOperations {
- int (*add)(int, int);
- int (*subtract)(int, int);
- };
- int add(int a, int b) {
- return a + b;
- }
- int subtract(int a, int b) {
- return a - b;
- }
- int main() {
- struct MathOperations math;
- math.add = add;
- math.subtract = subtract;
- int result1 = math.add(5, 3);
- int result2 = math.subtract(10, 4);
- printf("Addition result: %d\n", result1);
- printf("Subtraction result: %d\n", result2);
- return 0;
- }
在这个例子中,我们定义了一个MathOperations结构体,其中包含两个函数指针成员,分别用于执行加法和减法操作。我们将这些函数指针与相应的函数进行关联,并使用结构体中的函数指针调用函数。
- 动态分配结构体(Dynamic Allocation of Structures)
- #include <stdio.h>
- #include <stdlib.h>
- struct Person {
- char name[20];
- int age;
- };
- int main() {
- struct Person *person = (struct Person*) malloc(sizeof(struct Person));
- if (person == NULL) {
- printf("Memory allocation failed.\n");
- return 1;
- }
- strcpy(person->name, "John Doe");
- person->age = 25;
- printf("Name: %s\n", person->name);
- printf("Age: %d\n", person->age);
- free(person);
- return 0;
- }
在这个例子中,我们使用`malloc`函数动态地分配了一个`Person`结构体的内存空间。通过`sizeof`运算符确定所需的内存大小。然后,我们可以像使用普通结构体一样,访问和操作这个动态分配的结构体。最后,记得使用`free`函数释放动态分配的内存空间,以避免内存泄漏。
|