C語言結構體常見方法

2021-02-19 C語言三人行+

結構體定義:

第一種:只有結構體定義

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff{  

        char job[20];  

        int age;  

        float height;  

};  

第二種:附加該結構體類型的「結構體變量」的初始化的結構體定義

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

//直接帶變量名Huqinwei  

struct stuff{  

        char job[20];  

        int age;  

        float height;  

}Huqinwei;  

也許初期看不習慣容易困惑,其實這就相當於:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff{  

        char job[20];  

        int age;  

        float height;  

};  

struct stuff Huqinwei;  

第三種:如果該結構體你只用一個變量Huqinwei,而不再需要用

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff yourname;  

去定義第二個變量。

那麼,附加變量初始化的結構體定義還可進一步簡化出第三種:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct{  

        char job[20];  

        int age;  

        float height;  

}Huqinwei;  

把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變量了——至少我現在沒掌握這種方法。

結構體變量及其內部成員變量的定義及訪問:

繞口吧?要分清結構體變量和結構體內部成員變量的概念。

就像剛才的第二種提到的,結構體變量的聲明可以用:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff yourname;  

其成員變量的定義可以隨聲明進行:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff Huqinwei = {"manager",30,185};  

也可以考慮結構體之間的賦值:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

        struct stuff faker = Huqinwei;  

//或    struct stuff faker2;  

//      faker2 = faker;  

列印,可見結構體的每一個成員變量一模一樣  

如果不使用上邊兩種方法,那麼成員數組的操作會稍微麻煩(用for循環可能好點)

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

Huqinwei.job[0] = 'M';  

Huqinwei.job[1] = 'a';  

Huqinwei.age = 27;  

nbsp;Huqinwei.height = 185;  

結構體成員變量的訪問除了可以藉助符號".",還可以用"->"訪問(下邊會提)。

指針和數組:

這是永遠繞不開的話題,首先是引用:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff *ref = &Huqinwei;  

ref->age = 100;  

printf("age is:%d\n",Huqinwei.age);  

指針也是一樣的

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct stuff *ptr;  

ptr->age = 200;  

printf("age is:%d\n",Huqinwei.age);  

結構體也不能免俗,必須有數組:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct test{  

        int a[3];  

        int b;  

};  

//對於數組和變量同時存在的情況,有如下定義方法:  

        struct test student[3] =      {{{66,77,55},0},  

                                        {{44,65,33},0},  

                                        {{46,99,77},0}};  

//特別的,可以簡化成:  

        struct test student[3] =       {{66,77,55,0},  

                                        {44,65,33,0},  

                                        {46,99,77,0}};  

變長結構體

可以變長的數組

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

#include <stdio.h>  

#include <malloc.h>  

#include <string.h>  

typedef struct changeable{  

        int iCnt;  

        char pc[0];  

}schangeable;  

  

main(){  

        printf("size of struct changeable : %d\n",sizeof(schangeable));  

  

        schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));  

        printf("size of pchangeable : %d\n",sizeof(pchangeable));  

  

        schangeable *pchangeable2 = (schangeable *)malloc(sizeof(schangeable) + 20*sizeof(char));  

        pchangeable2->iCnt = 20;  

        printf("pchangeable2->iCnt : %d\n",pchangeable2->iCnt);  

        strncpy(pchangeable2->pc,"hello world",11);  

        printf("%s\n",pchangeable2->pc);  

        printf("size of pchangeable2 : %d\n",sizeof(pchangeable2));  

}  

運行結果

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

size of struct changeable : 4  

size of pchangeable : 4  

pchangeable2->iCnt : 20  

hello world  

size of pchangeable2 : 4  

結構體本身長度就是一個int長度(這個int值通常只為了表示後邊的數組長度),後邊的數組長度不計算在內,但是該數組可以直接使用。

(說後邊是個指針吧?指針也佔長度!這個是不佔的!原理很簡單,這個東西完全是數組後邊的尾巴,malloc開闢的是一片連續空間。其實這不應該算一個機制,感覺應該更像一個技巧吧)

結構體嵌套:

結構體嵌套其實沒有太意外的東西,只要遵循一定規律即可:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

//對於「一錘子買賣」,只對最終的結構體變量感興趣,其中A、B也可刪,不過最好帶著  

struct A{   

        struct B{  

             int c;  

        }  

        b;  

}  

a;  

//使用如下方式訪問:  

a.b.c = 10;   

特別的,可以一邊定義結構體B,一邊就使用上:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

struct A{  

        struct B{  

                int c;  

        }b;  

  

        struct B sb;  

  

}a;  

使用方法與測試:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

        a.b.c = 11;  

        printf("%d\n",a.b.c);  

        a.sb.c = 22;  

        printf("%d\n",a.sb.c);  

結果無誤。   

結構體與函數:

關於傳參,首先:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

void func(int);  

func(a.b.c);  

把結構體中的int成員變量當做和普通int變量一樣的東西來使用,是不用腦子就想到的一種方法。

另外兩種就是傳遞副本和指針了 :

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

//struct A定義同上  

//設立了兩個函數,分別傳遞struct A結構體和其指針。  

void func1(struct A a){  

        printf("%d\n",a.b.c);  

}  

void func2(struct A* a){  

        printf("%d\n",a->b.c);  

}  

main(){  

        a.b.c = 112;  

        struct A * pa;  

        pa = &a;  

        func1(a);  

        func2(&a);  

        func2(pa);  

}  

佔用內存空間:

struct結構體,在結構體定義的時候不能申請內存空間,不過如果是結構體變量,聲明的時候就可以分配——兩者關係就像C++的類與對象,對象才分配內存(不過嚴格講,作為代碼段,結構體定義部分「.text」真的就不佔空間了麼?當然,這是另外一個範疇的話題)。

結構體的大小是結構體所含變量大小的總和,並且不能用"char a[]"這種彈性(flexible)變量,必須明確大小,下面列印輸出上述結構體的size:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

        printf("size of struct man:%d\n",sizeof(struct man));  

        printf("size:%d\n",sizeof(Huqinwei));  

結果毫無懸念,都是28:分別是char數組20,int變量4,浮點變量4.   

和C++的類不一樣,結構體不可以給結構體內部變量初始化,。

如下,為錯誤示範:

[cpp] view plain copy 在CODE上查看代碼片派生到我的代碼片

#include<stdio.h>  

//直接帶變量名Huqinwei  

struct stuff{  

//      char job[20] = "Programmer";  

//      char job[];  

//      int age = 27;  

//      float height = 185;  

}Huqinwei;  

PS:結構體的聲明也要注意位置的,作用域不一樣。

C++的結構體變量的聲明定義和C有略微不同,說白了就是更「面向對象」風格化,要求更低。

相關焦點

  • C語言結構體(struct)常見使用方法
    ; 把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變量了——至少我現在沒掌握這種方法。也可以考慮結構體之間的賦值:[cpp] struct stuff faker = Huqinwei; 列印,可見結構體的每一個成員變量一模一樣 如果不使用上邊兩種方法,那麼成員數組的操作會稍微麻煩(用for循環可能好點)
  • C語言結構體常見寫法及用法
    關注+星標公眾號,不錯過精彩內容作者
  • C語言中的結構體和聯合體
    C語言實現面向對象的原理在 C 語言中,結構體(struct)是一個或多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組織在一個名字之下。簡單地說,我們可以把「結構體類型」和「結構體變量」理解為是面向對象語言中「類」和「對象」的概念。此外,結構體裡的成員也可以是一個結構體變量。
  • C語言結構體、枚舉以及位域的講解
    >C語言編寫實用小工具,任意進位數轉換【附源碼】【必讀】百行C語言代碼實現簡易版通訊錄,完成增刪改查功能【附源碼】【必讀】使用C語言寫一個簡易版掃雷小遊戲【必讀】結構體1、結構體的定義結構體變量的成員用以下一般形式表示:   結構體變量名.成員名在定義了結構體變量後,就可以用不同的賦值方法對結構體變量的每個成員賦值。
  • C語言編程 — 結構體與位域
    數組類型顯然無法滿足這一需求,此時可以使用結構體(Struct)來存放一組不同類型的數據。C 語言中,像 int、float、char 等是由 C 語言本身提供的數據類型,不能再進行分拆,我們稱之為基本數據類型。
  • C 語言中的結構體和共用體(聯合體)
    今天,我們來介紹一下 C 語言中結構體和共用體的相關概念和使用。簡單地說,我們可以把「結構體類型」和「結構體變量」理解為是面向對象語言中「類」和「對象」的概念。此外,結構體裡的成員也可以是一個結構體變量。
  • C語言中的結構體和共用體(聯合體)
    在 C 語言中,結構體(struct)是一個或多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組織在一個名字之下。由於結構體將一組相關變量看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的數據,特別是在大型的程序中。
  • C語言之結構體(struct)
    long、unsigned int 、short、char (相當於各種文件類型,比如 .txt、.c、.h)這些關鍵字是否很熟悉?這都是 C 語言定義好的數據類型,直接拿來用就行了。但是我想自定義一個別的類型的數據怎麼辦?就靠 struct 了。
  • C語言結構體(Struct)
    在C語言中,可以使用結構體(Struct)來存放一組不同類型的數據。結構體的定義形式為:struct 結構體名{    結構體所包含的變量或數組};結構體是一種集合,它裡面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員(Member)。
  • C語言結構體(struct)詳解
    列印,可見結構體的每一個成員變量一模一樣  複製代碼如果不使用上邊兩種方法,那麼成員數組的操作會稍微麻煩(用for循環可能好點):1. Huqinwei.job[0] = 'M';  2. Huqinwei.job[1] = 'a';  3.
  • 剖析c語言結構體的高級用法(二)
    (還有vs,這兩個編譯裡不能申明一個空的結構體,必須要有一個結構體成員來才行)寫成c語言程序空結構體的話,它會報錯,在新一點的編譯器裡面就不會報錯(比如dev,gcc)。說明(這裡是c++裡才這樣,在c語言裡輸出的結果不一樣的):
  • C語言結構體(struct)最全的講解(萬字乾貨)
    在C語言中,可以定義結構體類型,將多個相關的變量包裝成為一個整體使用。在結構體中的變量,可以是相同、部分相同,或完全不同的數據類型。在C語言中,結構體不能包含函數。在面向對象的程序設計中,對象具有狀態(屬性)和行為,狀態保存在成員變量中,行為通過成員方法(函數)來實現。C語言中的結構體只能描述一個對象的狀態,不能描述一個對象的行為。
  • XML消息與C語言程序結構體轉換的方法及裝置
    摘要:本發明公開了一種XML消息與C語言程序結構體轉換的方法,設置XML消息與C語言程序結構體格式的對應關係,該方法包括:接收並從XML消息中解析出欄位信息和所述XML消息對應的C語言程序結構體格式;根據所述欄位信息和C語言程序結構體格式,建立相應的C語言程序結構體;或者,根據C語言程序結構體和所述對應關係,建立與該C語言程序結構體對應的
  • C語言之結構體最全面總結
    而結構體的變量名並不是指向該結構體的地址,所以要使用取地址運算符&才能獲取地址:pinfo = &info;通過結構體指針來訪問結構體有以下兩種方法:第一個方法由於點號運算符比指針的取值運算符優先級更高
  • C語言系列(九):結構體
    這就需要一種新的數據類型,能夠將具有內在聯繫的不同類型的數據組成一個整體,在C語言中,這種數據類型就是結構體。在C語言中,結構體屬於構造數據類型,它由若干成員組成,成員的類型既可以是基本數據類型,也可以是構造數據類型,而且可以互不相同。struct 結構體類型名{ 類型1 成員名1; 類型2 成員名2; ...
  • 為什麼C語言中的結構體的size,並不等於它所有成員size之和?
    結構體在C語言程序開發中,是不可或缺的語法。不過,相信不少C語言初學者遇到過這樣的問題:為什麼結構體的 size 有時不等於它的所有成員的 size 之和呢?為什麼結構體的 size 有時不等於它的所C語言結構體大小等於它的所有成員大小之和嗎?
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    函數指針結構體稍微思考一下,應該能夠想到C語言中的普通數據類型不僅可以用於定義數組,還可以用來定義結構體,例如:struct cn{char c;int i;double d;};那麼可以看作「普通數據類型」的函數指針也可以定義結構體嗎?
  • C語言結構體變量
    為了解決這樣的問題,就要用到結構體這種構造類型,我們可以將每個學生的各項信息以不同類型的數據存放到一個結構體中,如用字符型表示姓名,用整型或字符型表示學號、用整型或實型表示成績。結構體變量的定義結構體就是將不同類型的數據組合成一個有機的整體,以便於引用。
  • 51單片機之C語言-4.3結構體
    當然可以,這個就叫做結構體。現在按照數組的學習方法來研究結構體,兩個問題,如何定義;如何訪問結構體成員。這裡小結一下,結構體變量定義一共有三種方法:1)先定義結構,再說明結構變量struct stu{ int num; char name[20]; char sex; float score;}struct stu boy1,boy2;
  • 不聲明變量的話,獲得C語言結構體的某個成員長度,可以這麼做
    小明在某個C語言項目開發中定義了一個結構體 parent,該結構體包含一個數組成員 char text[255],相關C語言代碼如下,請看:typedef struct _parent{float calc ;char text[255] ;