一、引言
在前兩篇文章中,我們已經探索了C語言struct的基本概念、進階技巧和應用。本篇文章将進一步研究struct的進階特性,包括聯合(union)和自引用struct(self-referencing struct),揭示更加特殊且強大的用法。
二、聯合:多種視角的資料共享
聯合的定義和基本使用
聯合(union)是一種特殊的資料類型,允許在相同的記憶體位置存儲不同的資料類型。這意味着聯合能夠讓不同的成員共享相同的記憶體空間。
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
// 對成員指派
data.i = 10;
printf("i: %d\n", data.i);
data.f = 3.14;
printf("f: %f\n", data.f);
strcpy(data.str, "Hello World");
printf("str: %s\n", data.str);
return 0;
}
在上述代碼中,我們定義了一個名為Data的聯合,其中包含了int、float和char數組類型的成員。通過給不同的成員指派,我們可以共享聯合的記憶體空間,并以不同的視角讀取該記憶體。
聯合的應用執行個體:聯合作為聯合體(tagged union)
聯合體(tagged union)是一個應用執行個體,它能夠在不同的類型之間共享記憶體,以實作靈活的資料結構。
#include <stdio.h>
enum DataType {
INT,
FLOAT,
STRING
};
union Data {
int i;
float f;
char str[20];
};
struct Variant {
enum DataType type;
union Data data;
};
void printVariant(struct Variant var) {
switch (var.type) {
case INT:
printf("Type: INT, Value: %d\n", var.data.i);
break;
case FLOAT:
printf("Type: FLOAT, Value: %f\n", var.data.f);
break;
case STRING:
printf("Type: STRING, Value: %s\n", var.data.str);
break;
default:
printf("Invalid type\n");
break;
}
}
int main() {
struct Variant variant1;
variant1.type = INT;
variant1.data.i = 10;
printVariant(variant1);
struct Variant variant2;
variant2.type = FLOAT;
variant2.data.f = 3.14;
printVariant(variant2);
struct Variant variant3;
variant3.type = STRING;
strcpy(variant3.data.str, "Hello World");
printVariant(variant3);
return 0;
}
在上述代碼中,我們定義了一個Variant struct,其中包含一個DataType類型的辨別符和一個Data聯合體。根據辨別符的不同,我們通過聯合體共享記憶體,并以不同的類型存儲和讀取資料。
三、自引用struct:建立複雜的資料結構
自引用struct指的是在struct中使用struct自身作為成員的情況。這樣的設計允許我們建立複雜的資料結構,如連結清單和樹等。
#include <stdio.h>
struct Node {
int data;
struct Node *next;
};
void printList(struct Node *head) {
struct Node *current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
struct Node node1, node2, node3;
node1.data = 10;
node1.next = &node2;
node2.data = 20;
node2.next = &node3;
node3.data = 30;
node3.next = NULL;
printList(&node1);
return 0;
}
在上述代碼中,我們定義了一個Node struct,其中包含一個int類型的data成員和一個指向自身的指針next。通過自引用struct,我們建立了一個簡單的連結清單,Node之間通過next指針連接配接起來。
四、結論
本文深入研究了C語言struct的兩個進階特性:聯合和自引用struct。聯合的靈活性使不同類型的資料共享記憶體,而自引用struct可以建立複雜的資料結構。