struct 結構體解析(原)


(一)基本概念

    結構體是一個或是多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組合在一個名字之下。我們將關鍵字struct引入了結構聲明中。結構聲明包含在花括號內的一系列聲明組成。例如:

// 以下是一個巨普通的結構體,表示坐標。
// point 為結構標記;x, y為成員。
struct point
{
    int x;
    int y;
};
 
// 以下是跟變量表的情形
struct point
{
    int x;
    int y;
}px, py, pz;
 

(二)使用方法

1. 初始化方法

    (1) 結構體變量的初始化方式分別給結構體的成員變量以初始值.

具體的形式如下:

struct 結構體標識符
{
成員變量列表;
};
第一種初始化:
struct 結構體標識符 變量名 = {初始化值1,初始化值2,…, 初始化值n };
 
struct point impl = {100, 200};
 
第二種初始化:
struct 結構體標識符 變量名;
變量名.成員 = 值;
 
struct point impl;
impl.x = 100;
impl.y = 200;
 
第三種初始化方法:
struct 結構體標識符
{
成員變量列表;
}變量名 = {初始化值1,初始化值2,…, 初始化值n };
 
struct point
{
    int x;
    int y;
}impl = {100, 200};
 

對於結構體內還有結構體的形式,可以用以下的方式來解決:

struct rect
{
    struct point pt1;
    struct point pt2;
};
第一種初始化方法:
struct rect rect_impl;
rect_impl.pt1.x = 100;
 
第二種初始化方法:
struct rect
{
    struct point pt1;
    struct point pt2;
}rect_impl = {
    {100, 200},
    {300, 400}
};
 

2. 結構體與指針

    結構與指針其實密不可分,在函數的返回和調用中,我們不能用復制整個結構體的方式,因為這樣的效率實在是太低了。誰都不希望將一個大象抗在身上,然后到處跑!幽靈

    這個時候,指針出現了。就像救世主出現在人間,趕走了大象,留下了羽毛。

以下是實現形式:

struct point *ppt, origin;
origin.x = 100;
origin.y = 200;
 
ppt = &origin; // 將origin的地址傳給ppt
// 以下是結構體指針的兩種調用形式
std::cout << (*ppt).x << std::endl; // 100
std::cout << ppt->x << std::endl; // 100
 
// 對於函數的調用
struct point *func(struct point *, int x){}

3. 結構體與數組,鏈表

   如果說當個結構體個體只是一塊板磚的話,那么與數組結合,就是一堆板磚啊!悄悄話我們常使用數組來儲存一些東西,這些東東看重的數組的線性結構。當然,如果結構體內部有結構體指針,那么我們可以來組鏈表。線性結構的關鍵在於查找時的時間損耗,O(1)是許多人追求的夢想。而鏈表的容量巨大,只要你內存夠大,它就能讓你欲罷不能捧腹大笑!魚和熊掌不能兼得,O(n)時間的損耗是你要權衡的。

以下是數組太陽實現形式:

// 結構體與數組
// 第一種實現形式:
struct point
{
    int x;
    int y;
}pta[] = {
    2, 2,
    3, 3,
    4, 3
};
 
// 第二種實現形式:
struct point
{
    int x;
    int y;
};
 
struct point pta[10]; // 定義了10個point
pta[1].x = 100;

以下是鏈表太陽的形式:

// 二叉樹的鏈式結構
typedef struct tNode
{
    int Elem;
    struct tNode *LChild;
    struct tNode *RChild;
}*BiTree;
 
// 構造二叉樹的方法
// 構造一棵空的二叉樹
void InitBiTree(BiTree &BIT)
{
    if (!(BIT = (BiTree)malloc(sizeof(tNode)))){exit(1);}
 BIT->LChild = NULL; // 左子樹為空
 BIT->RChild = NULL; // 右子樹為空
}

4. 結構體與typedef

    typedef用來建立新的數據類型名。以下用代碼來解釋:

// 二叉樹的鏈式結構
typedef struct tNode
{
    Data_Type_BiTR Elem;
    struct tNode *LChild;
    struct tNode *RChild;
}*BiTree;
 
// 也可用下面的方式
struct tNode
{
    Data_Type_BiTR Elem;
    struct tNode *LChild;
    struct tNode *RChild;
};
 
typedef struct tNode *BiTree;
 
// 以上兩種效果都一樣

    其實,typedef沒有創建新的類型。只是增加了一個新的名詞而已。這樣做的好處有倆大笑:首先呢,程序參數化,提高移植性。其次,就是好改啦,改一個地方就可以影響所有的地方了。

參考文獻

1.《C++ primer》和《C語言程序設計》

2. 參閱了網上許多小道的內容,這個記不得了。。抱歉抱歉!!吐舌笑臉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM