天天看點

探索C語言struct的進階特性(下):聯合和自引用struct

作者:霸都嵌入式

一、引言

在前兩篇文章中,我們已經探索了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可以建立複雜的資料結構。

繼續閱讀