C語言系列(九):結構體

2021-02-14 青葙子嵌入式
實際問題中,經常需要對一些類型不同但又相互關聯的數據進行處理。這就需要一種新的數據類型,能夠將具有內在聯繫的不同類型的數據組成一個整體,在C語言中,這種數據類型就是結構體。在C語言中,結構體屬於構造數據類型,它由若干成員組成,成員的類型既可以是基本數據類型,也可以是構造數據類型,而且可以互不相同。
struct 結構體類型名{    類型1 成員名1;    類型2 成員名2;    ...    類型n 成員名n;};

其中,struct是定義結構體類型的關鍵字;結構體類型名必須是合法的C標識符,與其前面的struct一起共同構成結構體類型名;花括號內的內容是結構體類型所包括的結構體成員,也稱為結構體分量。
struct student{    int num;    char name[10];    int chinese,math;};

2)成員類型可以是除本身所屬結構體類型外的任何已有數據類型3)在同一作用域內,結構體類型名不能與其他變量名或結構體類型名重名4)同一個結構體各成員不能重名,但允許成員名與程序中的變量名,函數名相同5)結構體類型的作用域與普通變量的作用域相同:在函數內定義,則僅在函數內部起作用;在函數外定義,則有全局作用在實際工作中,一個較複雜的實體往往由多個成員構成,每個成員可以是C語言的基本數據類型,也可以是構造類型,當結構成員的數據類型又是結構類型時,就形成了結構類型的嵌套。
struct date{    int year,month,day;};
struct student{ int num; char name[10]; struct date birthday; int chinese,math;};

注意:定義嵌套結構,必須先定義成員結構,再定義主結構體。C語言規定,變量必須先定義後使用,主函數語句struct student s1,s2;就是結構體變量定義語句,定義了兩個結構體變量s1和s2,其數據類型是struct student。單獨定義是指先定義一個結構體類型,再定義這種結構體類型的變量。
struct student{    int num;    char name[10];    int chinese,math;};
struct student S1,S2;

注意:關鍵字struct和結構名student必須聯合使用,它們合起來表示一個數據類型名
struct student{    int num;    char name[10];    int chinese,math;}S1,S2;

無類型名定義是指在定義結構體變量時省略結構體名稱。
struct {    int num;    char name[10];    int chinese,math;}S1,S2;

無類型名方式只定義結構體變量,不定義結構體類型,若需要定義其他結構體變量,必須把定義過程重新寫一遍。結構體變量的初始化是指在定義結構體變量時對其賦初值。
struct student S1={101,」Li」,100,90};

結構體變量的存儲形式:按結構體類型定義中成員的先後順序排列。所佔內存空間等於咯成員所佔內存空間之和。可以用長度運算符sizeof計算其所佔空間,計算結果以字節為單位。
sizeof(struct student)sizeof(S1)

1)結構體類型與結構體變量是兩個不同的概念。前者只聲明結構體的組織形式,本身不佔存儲空間,後者是結構體類型的具體實例,在定義結構體變量時,編譯系統為其分配存儲空間。使用結構體變量主要是引用其結構成員,在C語言中,使用成員運算符(.)來引用結構成員。
struct nest_student stu1;stu1.num=1001;strcpy(stu1.name,」Li」);scanf(「%d」,&stu1.birthday.year);printf(「name: %s,stu1.name」);

在C語言中可以對兩個相同類型的結構體變量進行整體賦值。賦值時,將賦值符右邊結構體變量的每個成員值都賦值給左邊結構體變量中相應的成員。還可用結構體作為函數參數,或者用結構體類型作為函數返回值類型,以便在函數間傳遞複雜數據,屬於值傳遞。如果有許多相同類型的實體,就需要使用結構體數組。結構體數組是結構體類型與數組的結合,它能將多個具有相同類型的實體組織起來。對結構體數組成員的引用是通過使用數組下標與成員運算符(.)相結合的方式來實現。一般通過賦值語句,將同類型的一個結構體數組元素賦值給另一個元素,或賦值同類型的結構體變量。屬於址傳遞,要求形參必須是地址參數,即必須是同類型的結構體數組或結構體指針。當指針指向結構體變量時,稱為結構體指針,當然,指針變量也可以用來指向結構體數組中的元素。
struct student s={101,」Li」,100,90};struct student *p;p=&s;

結構體指針的值實際上是結構體變量的首地址。有了結構體指針的定義,既可以通過結構體變量s直接訪問結構成員,也可以通過結構體指針變量p間接訪問它所指向的結構體變量s的各個成員。說明:必須加小圓括號(),因為間接訪問運算符*的優先級低於成員運算符.

相關焦點

  • C語言編程 — 結構體與位域
    數組類型顯然無法滿足這一需求,此時可以使用結構體(Struct)來存放一組不同類型的數據。C 語言中,像 int、float、char 等是由 C 語言本身提供的數據類型,不能再進行分拆,我們稱之為基本數據類型。
  • C語言結構體(Struct)
    在C語言中,可以使用結構體(Struct)來存放一組不同類型的數據。結構體的定義形式為:struct 結構體名{    結構體所包含的變量或數組};結構體是一種集合,它裡面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員(Member)。
  • C語言結構體、枚舉以及位域的講解
    【置頂】一個好玩的小遊戲(純C語言編寫)【置頂】如果是初學C語言請看完,如何學好C語言絕對精品【必讀】乾貨丨程式設計師必定會愛上的十款軟體【必讀】10分鐘,快速掌握C語言指針【必讀】8個基礎且實用的C語言經典實例【附源碼】【必讀】C語言實現圖書管理系統源碼,已驗證可以直接運行【必讀】
  • C語言中的結構體和聯合體
    C語言實現面向對象的原理在 C 語言中,結構體(struct)是一個或多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組織在一個名字之下。由於結構體將一組相關變量看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的數據,特別是在大型的程序中。共用體(union),也稱為聯合體,是用於(在不同時刻)保存不同類型和長度的變量,它提供了一種方式,以在單塊存儲區中管理不同類型的數據。今天,我們來介紹一下 C 語言中結構體和共用體的相關概念和使用。
  • 剖析c語言結構體的高級用法(二)
    (還有vs,這兩個編譯裡不能申明一個空的結構體,必須要有一個結構體成員來才行)寫成c語言程序空結構體的話,它會報錯,在新一點的編譯器裡面就不會報錯(比如dev,gcc)。說明(這裡是c++裡才這樣,在c語言裡輸出的結果不一樣的):
  • C語言結構體常見方法
    把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變量了——至少我現在沒掌握這種方法。struct B{               int c;          }          b;  }  a;  //使用如下方式訪問:  a.b.c = 10;   特別的,可以一邊定義結構體B,一邊就使用上:[cpp] view plain copy 在CODE
  • C語言結構體(struct)詳解
    //對於「一錘子買賣」,只對最終的結構體變量感興趣,其中A、B也可刪,不過最好帶著  2. struct A{   3.         struct B{  4.              int c;  5.         }  6.
  • C語言之結構體(struct)
    long、unsigned int 、short、char (相當於各種文件類型,比如 .txt、.c、.h)這些關鍵字是否很熟悉?這都是 C 語言定義好的數據類型,直接拿來用就行了。但是我想自定義一個別的類型的數據怎麼辦?就靠 struct 了。
  • C 語言中的結構體和共用體(聯合體)
    在 C 語言中,結構體(struct)是一個或多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組織在一個名字之下。由於結構體將一組相關變量看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的數據,特別是在大型的程序中。
  • C語言中的結構體和共用體(聯合體)
    在 C 語言中,結構體(struct)是一個或多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組織在一個名字之下。由於結構體將一組相關變量看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的數據,特別是在大型的程序中。
  • C語言結構體(struct)常見使用方法
    ; 把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變量了——至少我現在沒掌握這種方法。B{ int c; }b; struct B sb; }a; 使用方法與測試:[cpp] a.b.c = 11;
  • C語言結構體(struct)最全的講解(萬字乾貨)
    在C語言中,可以定義結構體類型,將多個相關的變量包裝成為一個整體使用。在結構體中的變量,可以是相同、部分相同,或完全不同的數據類型。在C語言中,結構體不能包含函數。在面向對象的程序設計中,對象具有狀態(屬性)和行為,狀態保存在成員變量中,行為通過成員方法(函數)來實現。C語言中的結構體只能描述一個對象的狀態,不能描述一個對象的行為。
  • C語言之結構體最全面總結
    定義我們剛剛申請了一個名叫Info的結構體類型,那麼理論上我們可以像聲明其他變量的操作一樣,去聲明我們的結構體操作,但是C語言中規定,聲明結構體變量的時候,struct關鍵字是不可少的。學號:20191102姓名:Joy入學時間:2019/9/8學制:5畢業時間:2024傳遞指向結構體變量的指針早期的C語言是不允許直接將結構體作為參數直接傳遞進去的。主要是考慮到如果結構體的內存佔用太大,那麼整個程序的內存開銷就會爆炸。不過現在的C語言已經放開了這方面的限制。
  • 為什麼C語言中的結構體的size,並不等於它所有成員size之和?
    結構體在C語言程序開發中,是不可或缺的語法。不過,相信不少C語言初學者遇到過這樣的問題:為什麼結構體的 size 有時不等於它的所有成員的 size 之和呢?為什麼結構體的 size 有時不等於它的所C語言結構體大小等於它的所有成員大小之和嗎?
  • C語言結構體常見寫法及用法
    關注+星標公眾號,不錯過精彩內容作者
  • C語言結構體變量
    為了解決這樣的問題,就要用到結構體這種構造類型,我們可以將每個學生的各項信息以不同類型的數據存放到一個結構體中,如用字符型表示姓名,用整型或字符型表示學號、用整型或實型表示成績。結構體變量的定義結構體就是將不同類型的數據組合成一個有機的整體,以便於引用。
  • 快速上手系列-C語言之結構體(二)結構體數組與結構體指針
    結構體數組對於結構體數組,我們先回想一下整型數組,然後舉例我們要統計咱們班30個人的姓名,學號 ,成績,如果我們用結構體變量來實現是不現實的。那麼我們就準備用結構體數組來完成這事。結構體數組就是同一類型的結構體變量的集合,內存分布上是連續的。
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    函數指針結構體稍微思考一下,應該能夠想到C語言中的普通數據類型不僅可以用於定義數組,還可以用來定義結構體,例如:struct cn{char c;int i;double d;};那麼可以看作「普通數據類型」的函數指針也可以定義結構體嗎?
  • XML消息與C語言程序結構體轉換的方法及裝置
    摘要:本發明公開了一種XML消息與C語言程序結構體轉換的方法,設置XML消息與C語言程序結構體格式的對應關係,該方法包括:接收並從XML消息中解析出欄位信息和所述XML消息對應的C語言程序結構體格式;根據所述欄位信息和C語言程序結構體格式,建立相應的C語言程序結構體;或者,根據C語言程序結構體和所述對應關係,建立與該C語言程序結構體對應的
  • C語言系列(十一):共用體與枚舉類型
    共用體與枚舉也是C語言的兩種用戶定義的數據類型。