在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言結構體史上最詳細的講解【軟件干貨】

哈哈hfgfdf ? 來源:嵌入式學習資料 ? 作者:嵌入式學習資料 ? 2024-03-28 17:52 ? 次閱讀

struct結構體數據類型

前言

我們知道,在C語言中有一些基本的數據類型,如charintfloatlongdoublestring(c99)

等等數據類型,他們可以表示一些事物的基本屬性,但是當我們想表達一個事物的全部或部分屬性時,這時候再用單一的基本數據類型明顯就無法滿足需求了,這時候C提供了一種自定義數據類型,他可以封裝多個基本數據類型,這種數據類型叫結構體,英文名稱struct,可以使用struct關鍵詞聲明結構體

結構體的聲明

結構體的聲明語法如下

struct [structure tag] /*結構體的標簽*/{

   member definition; /*零個或多個成員變量的定義*/
   member definition;
   ...
   member definition;
} [one or more structure variables];  /*一個或多個結構體變量的定義*/

結構體標簽(structure tag)是可選的,但是推薦還是寫上,這樣使得代碼更加規范清晰,成員變量的定義一般為基本數據類型,如int age;char name[10]等,成員變量之間使用;隔開,最后一個成員變量后面的;可選, 如下面定義一個圖書信息的結構體變量

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

如下所示

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id
} book;

我省略了最后一個成員變量后面的分號;代碼可以正常運行,但是當我使用gcc編譯的時候,出現了下面信息

gcc struct.c
```
 output
``` shell
struct.c1: warning: no semicolon at end of struct or union
 } book;
 ^

這是警告提示,提示我們需要在struct和union數據類型定義的后面加上分號;,這樣的好處就是當我們需要再添加一個成員變量的時候,只需寫上該成員變量的定義,而無需先敲;,我太機智了,手動滑稽...

沒有成員變量的結構體

我們也可以定義一個空的結構體,有時候我們需要某一個結構體數據類型,但是暫時又不知道如何填充里面的成員變量,我們可以有如下定義

struct Books {
  //TODO
} book;

訪問結構體成員

定義完結構體積后接下來就是去訪問它并給他賦值,為了訪問一個結構體成員變量,我們可以使用成員操作符(.)成員訪問運算符被編碼為結構變量名稱和我們希望訪問的結構成員之間的句點(.)如下所示的完整代碼

struct.c

#include 
#include 

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */

   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali");
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;

   /* print Book1 info */
   printf( "Book 1 title : %sn", Book1.title);
   printf( "Book 1 author : %sn", Book1.author);
   printf( "Book 1 subject : %sn", Book1.subject);
   printf( "Book 1 book_id : %dn", Book1.book_id);

   /* print Book2 info */
   printf( "Book 2 title : %sn", Book2.title);
   printf( "Book 2 author : %sn", Book2.author);
   printf( "Book 2 subject : %sn", Book2.subject);
   printf( "Book 2 book_id : %dn", Book2.book_id);

   return 0;
}

編譯并執行

gcc struct.c && ./a.out

輸出

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

結構作為函數參數

同樣的,我們也可以像基本數據類型一樣,把結構體作為函數的參數,如下所示我們定義一個打印結構體的函數

#include 
#include 

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* function declaration */
void printBook( struct Books book );

int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */

   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali");
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;

   /* print Book1 info */
   printBook( Book1 );

   /* Print Book2 info */
   printBook( Book2 );

   return 0;
}

void printBook( struct Books book ) {

   printf( "Book title : %sn", book.title);
   printf( "Book author : %sn", book.author);
   printf( "Book subject : %sn", book.subject);
   printf( "Book book_id : %dn", book.book_id);
}

編譯運行

gcc struct.c && ./a.out

輸出

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

結構體的指針

我們也可以定義結構體指針,像這樣

struct Books *struct_pointer;

現在你可以存放結構體變量的地址在結構體變量指針中.和基本數據類型的變量一樣,我們使用&操作符取一個變量的地址

struct_pointer = &Book1;

接下來就是使用結構體指針去訪問成員變量了,訪問的操作符我們由原來的.變為->,沒錯,這個是不是很形象呢?完整代碼如下

#include 
#include 

struct Books {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* function declaration */
void printBook( struct Books *book );
int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */

   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali");
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;

   /* print Book1 info by passing address of Book1 */
   printBook( &Book1 );

   /* print Book2 info by passing address of Book2 */
   printBook( &Book2 );

   return 0;
}

void printBook( struct Books *book ) {

   printf( "Book title : %sn", book->title);
   printf( "Book author : %sn", book->author);
   printf( "Book subject : %sn", book->subject);
   printf( "Book book_id : %dn", book->book_id);
}

編譯運行

gcc struct.c && ./a.out

輸出

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

結構體數組

#include 
#include 

struct Books {
    char  title[50];
    char  author[50];
    char  subject[100];
    int   book_id;
};

/* function declaration */
void printBook( struct Books *book );
int main( ) {

    struct Books books[2];

    /* book 1 specification */
    strcpy( books[0].title, "C Programming");
    strcpy( books[0].author, "Nuha Ali");
    strcpy( books[0].subject, "C Programming Tutorial");
    books[0].book_id = 6495407;

    /* book 2 specification */
    strcpy( books[1].title, "Telecom Billing");
    strcpy( books[1].author, "Zara Ali");
    strcpy( books[1].subject, "Telecom Billing Tutorial");
    books[1].book_id = 6495700;

    /* print Book1 info by passing address of Book1 */
    printBook( &books[0] );

    /* print Book2 info by passing address of Book2 */
    printBook( &books[1] );

    return 0;
}

void printBook( struct Books *book ) {

    printf( "Book title : %sn", book->title);
    printf( "Book author : %sn", book->author);
    printf( "Book subject : %sn", book->subject);
    printf( "Book book_id : %dn", book->book_id);
}

編譯運行

gcc struct.c && ./a.out

輸出

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

結構體的內存計算

沒錯,估計你已經知道了,結構體變量的所占用內存空間的大小為各成員變量所占空間之和,如下所示的結構體占用內存大小在注釋里面

#include 
#include 

struct Books {
};

int main( ) {
    printf("%dn", (int) sizeof(struct Books)); /*0*/
    return 0;
}
#include 
#include 

struct Books {
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
};

int main() {
    printf("%dn", (int) sizeof(struct Books)); /*204*/
    return 0;
}

位域

有時候我們內存緊張的時候,我們可以使用位域定義結構體成員變量,比如當我們需要定義一個表示true或false的時候,如果想這樣定義

int isOpen;

明顯很浪費空間,因為一個真假值只需要一個字位表示,所以我們可以這樣定義

unsigned int isOpen:1;

但是如果你直接寫在函數中是會報錯的,我們應該寫在結構體中

int main() {
    unsigned int isOpen:1; /*編譯無法通過*/
    return 0;
}

正確姿勢

struct packed_struct {
   unsigned int f1:1;
   unsigned int f2:1;
   unsigned int f3:1;
   unsigned int f4:1;
   unsigned int type:4;
   unsigned int my_int:9;
} pack;

C盡可能緊湊地自動打包上述位字段,前提是字段的最大長度小于或等于計算機的整數字長。如果不是這種情況,那么一些編譯器可能允許字段存儲器重疊,而其他編譯器會將下一個字段存儲在下一個字中。

#include 
#include 

struct packed_struct {
    unsigned int f1:1;
    unsigned int f2:1;
    unsigned int f3:1;
    unsigned int f4:1;
    unsigned int type:4;
    unsigned int my_int:9;
} pack;
int main() {
    printf("%dn", (int) sizeof(struct packed_struct));
    return 0;
}

輸出結果 8

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7626

    瀏覽量

    139617
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    11002
收藏 1人收藏

    評論

    相關推薦

    C語言結構對齊介紹

    大家好,我是嵌入式老林,從事嵌入式軟件開發多年,今天分享的內容是C語言結構對齊介紹,希望能對你有所幫助
    發表于 07-11 11:50 ?2833次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結構</b><b class='flag-5'>體</b>對齊介紹

    C語言中數組和結構的內存表示和布局

    C語言中,數組和結構都可以代表一塊內存,但為什么結構可以直接賦值,而數組不可以?這個問題涉及
    發表于 08-28 10:54 ?1942次閱讀

    詳細講解c語言enum枚舉類型

    詳細講解C語言enum枚舉類型在實際應用中,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只有七種可能取值。在 C
    發表于 12-21 23:22

    漫談C語言結構

      相信大家對于結構都不陌生。在此,分享出本人對c語言結構的學習心得。如果你發現這個總結中有
    發表于 11-15 15:59

    干貨c語言基礎語法——結構

    1、關于C語言結構的引入在實際問題中有時候我們需要幾種數據類型一起來修飾某個變量。例如一個學生的信息就需要學號(字符串),姓名(字符串),年齡(整形)等等。這些數據類型都不同但是他們
    發表于 06-03 17:10

    結構的相關資料下載

    擊上方“果果小師弟”,選擇“置頂/星標公眾號”干貨福利,第一時間送達!摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機
    發表于 01-07 08:25

    怎樣去使用C語言結構和共用

    C語言結構和共用分別有何特點呢?怎樣去使用C語言
    發表于 01-17 07:51

    c語言_結構和共同體

    這份PPT很全面講解了結構的各種用法,夠全面,對結構的各種應用也舉了例子,本人已驗證過的!另外也講解了共同體和枚舉,這兩部分描述較少。
    發表于 06-15 10:58 ?0次下載

    C語言程序設計教程之選擇結構的資料講解

    本文檔的主要內容詳細介紹的是C語言程序設計教程之選擇結構的資料講解主要內容包括了:1 語句與復合語句,2 if 語 句,3 if…else
    發表于 01-08 14:19 ?11次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計教程之選擇<b class='flag-5'>結構</b>的資料<b class='flag-5'>講解</b>

    C語言程序設計教程之結構與共用詳細資料說明

    本文檔詳細介紹的是C語言程序設計教程之結構與共用詳細
    發表于 03-01 17:20 ?11次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計教程之<b class='flag-5'>結構</b><b class='flag-5'>體</b>與共用<b class='flag-5'>體</b>的<b class='flag-5'>詳細</b>資料說明

    干貨|手把手教你寫單片機的C語言結構

    摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機必須要掌握的,如果你C語言
    發表于 11-23 17:51 ?42次下載
    <b class='flag-5'>干貨</b>|手把手教你寫單片機的<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結構</b><b class='flag-5'>體</b>

    C語言-結構與位域

    C語言里的結構是可以包含不同數據類型和相同數據類型的一個有序集合,屬于構造類型,可以自己任意組合,并且結構
    的頭像 發表于 08-14 10:06 ?1880次閱讀

    C語言入門之結構指針

    C語言中,指向結構對象的指針變量既可以指向結構變量,也可指向
    的頭像 發表于 03-24 14:59 ?1234次閱讀

    C語言結構完全筆記

    我們剛剛申請了一個名叫Info的結構類型,那么理論上我們可以像聲明其他變量的操作一樣,去聲明我們的結構體操作,但是C語言中規定,聲明
    的頭像 發表于 08-01 16:52 ?742次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結構</b><b class='flag-5'>體</b>完全筆記

    C語言C++中結構的區別

    同樣是結構,看看在C語言C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?579次閱讀
    主站蜘蛛池模板: 久久久噜噜噜久久 | 3344免费播放观看视频 | 人人乳乳香蕉大免费 | 男啪女色黄无遮挡免费视频 | 欧美色成人综合 | 综合色综合 | 亚洲国产欧美日韩一区二区三区 | 2019天天干 | 高清国产美女在线观看 | 天天爱天天做天天干 | 日本a网| 免费国产午夜高清在线视频 | 日本免费黄色大片 | 久久久久国产一级毛片高清板 | 午夜免费视频网站 | 未成人禁止视频高清在线观看 | 77788色淫免费网站视频 | 成 人色 网 站999 | 久久综合一 | 亚洲午夜视频 | 久久午夜免费视频 | 欧美性xx18一19 | 免费看片aⅴ免费大片 | 四虎永久在线精品国产 | 操女网站| 午夜影院一级片 | 一区二区高清在线 | 日日拍拍| 午夜宅男在线视频 | avtt香蕉| 久久综合五月婷婷 | 恐怖片大全恐怖片免费观看好看的恐怖片 | 手机在线黄色 | 午夜视频观看 | 2021国产成人午夜精品 | 奇米欧美成人综合影院 | 婷婷草 | 欧美极品| 免费观看欧美一级片 | 俺去操| 乱好看的的激情伦小说 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品