亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言中的結構體的入門學習教程

2020-05-23 14:11:51
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C語言中的結構體的入門學習教程,以struct語句定義的結構體是C語言編程中的重要基礎,需要的朋友可以參考下
 

C語言中數組允許定義類型的變量,可容納相同類型的多個數據項,但結構體在C語言編程中,它允許定義不同種類的數據項可供其他用戶定義的數據類型。

結構是用來代表一個記錄,假設要跟蹤圖書館的書籍。可能要跟蹤有關每本書以下屬性:

  • Title - 標題
  • Author - 作者
  • Subject - 科目
  • Book ID - 編號

定義結構體
定義一個結構體,必須使用結構體的struct語句。該struct語句定義了一個新的數據類型,程序不止一個成員。struct語句的格式是這樣的:

struct [structure tag]{  member definition;  member definition;  ...  member definition;} [one or more structure variables]; 

結構體(structure)標簽是可選的,每個成員的定義是一個正常的變量定義,如 int i; 或 float f; 或任何其他有效的變量的定義。在結構的定義的結尾,最后的分號之前,可以指定一個或多個結構變量,但它是可選的。這里是聲明書(Book)的結構方式:

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

訪問結構體成員
要訪問結構體的任何成員,我們使用成員訪問運算符(.)成員訪問運算符是編碼作為結構體變量名,并且希望訪問結構體部件。使用struct關鍵字來定義結構體類型的變量。以下為例子來解釋結構的用法:

#include <stdio.h>#include <string.h> 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 : %s", Book1.title);  printf( "Book 1 author : %s", Book1.author);  printf( "Book 1 subject : %s", Book1.subject);  printf( "Book 1 book_id : %d", Book1.book_id);  /* print Book2 info */  printf( "Book 2 title : %s", Book2.title);  printf( "Book 2 author : %s", Book2.author);  printf( "Book 2 subject : %s", Book2.subject);  printf( "Book 2 book_id : %d", Book2.book_id);  return 0;}

讓我們編譯和運行上面的程序,這將產生以下結果:

Book 1 title : C ProgrammingBook 1 author : Nuha AliBook 1 subject : C Programming TutorialBook 1 book_id : 6495407Book 2 title : Telecom BillingBook 2 author : Zara AliBook 2 subject : Telecom Billing TutorialBook 2 book_id : 6495700

結構體作為函數參數
可以傳遞一個結構作為函數的參數,非常類似傳遞任何其他變量或指針。訪問可以象在上面的例子已經訪問類似結構變量的方式:

#include <stdio.h>#include <string.h> 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 : %s", book.title);  printf( "Book author : %s", book.author);  printf( "Book subject : %s", book.subject);  printf( "Book book_id : %d", book.book_id);}

讓我們編譯和運行上面的程序,這將產生以下結果:

Book title : C ProgrammingBook author : Nuha AliBook subject : C Programming TutorialBook book_id : 6495407Book title : Telecom BillingBook author : Zara AliBook subject : Telecom Billing TutorialBook book_id : 6495700

指針結構
非常相似定義指針結構,來定義指向任何其他變量,如下所示:

struct Books *struct_yiibaier;

現在,可以存儲結構變量的地址在上面定義的指針變量。為了找到一個結構變量的地址,將使用運算符&在結構體的名字之前,如下所示:

struct_yiibaier = &Book1;

訪問使用一個指向結構的結構的成員,必須使用  -> 運算符如下:

struct_yiibaier->title;

讓我們重新寫上面的例子中使用結構指針,希望這將能夠讓我們更容易地理解概念:

#include <stdio.h>#include <string.h> 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 : %s", book->title);  printf( "Book author : %s", book->author);  printf( "Book subject : %s", book->subject);  printf( "Book book_id : %d", book->book_id);}

讓我們編譯和運行上面的程序,這將產生以下結果:

Book title : C ProgrammingBook author : Nuha AliBook subject : C Programming TutorialBook book_id : 6495407Book title : Telecom BillingBook author : Zara AliBook subject : Telecom Billing TutorialBook book_id : 6495700

位字段
位字段允許數據在一個結構體包裝。這是特別有用的,當內存或存儲數據非常寶貴。典型的例子:

包裝幾個對象到一個機器語言。例如1位標志能夠壓縮長度

讀取外部的文件格式 - 非標準的文件格式可以讀出。例如: 9位整數。

C語言允許我們通過結構定義:bit 長度的變量之后。例如:

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;

在這里,packed_struct包含6個成員:四個1位標志s f1..f3, 一個 4 位類型和9位my_int。

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

指針和數組:
這是永遠繞不開的話題,首先是引用:

    struct stuff *ref = &Huqinwei;    ref->age = 100;    printf("age is:%d/n",Huqinwei.age);

打印可見變化 
指針也是一樣的

    struct stuff *ptr;    ptr->age = 200;    printf("age is:%d/n",Huqinwei.age);

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

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}};

變長結構體:
可以變長的數組

#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));}

運行結果

size of struct changeable : 4size of pchangeable : 4pchangeable2->iCnt : 20hello worldsize of pchangeable2 : 4

結構體本身長度就是一個int長度(這個int值通常只為了表示后邊的數組長度),后邊的數組長度不計算在內,但是該數組可以直接使用。
(說后邊是個指針吧?指針也占長度!這個是不占的!原理很簡單,這個東西完全是數組后邊的尾巴,malloc開辟的是一片連續空間。其實這不應該算一個機制,感覺應該更像一個技巧吧)

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

//對于“一錘子買賣”,只對最終的結構體變量感興趣,其中A、B也可刪,不過最好帶著struct A{     struct B{       int c;    }    b;}a;//使用如下方式訪問:a.b.c = 10; 

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

struct A{    struct B{        int c;    }b;    struct B sb;}a;

使用方法與測試:

    a.b.c = 11;    printf("%d/n",a.b.c);    a.sb.c = 22;    printf("%d/n",a.sb.c);

結果無誤。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人午夜激情视频| 久久精品2019中文字幕| 国产精品欧美日韩一区二区| 欧美成在线观看| 中文日韩电影网站| 国产精品69精品一区二区三区| 欧美福利视频在线观看| 成人黄色网免费| 久久久久久久久国产精品| 亚洲毛片在线观看| 欧美又大又硬又粗bbbbb| 欧美另类暴力丝袜| 91高清免费在线观看| 久久久精品一区二区三区| 国产精品视频资源| 亚洲精品国产综合久久| 成人精品福利视频| 久久精视频免费在线久久完整在线看| 久久精彩免费视频| 成人精品视频99在线观看免费| 国产一区二区三区在线视频| 亚洲人成在线观| 日韩精品在线视频美女| 九九精品在线观看| 97激碰免费视频| 色综合伊人色综合网| 欧美精品videossex性护士| 久久久久久国产精品| 色无极亚洲影院| 午夜精品久久久久久99热| 亚洲色图第三页| 亚洲第一区在线| 久久久国产精品亚洲一区| 亚洲精品国产福利| 欧美成人激情视频免费观看| 久久夜精品香蕉| 精品国内产的精品视频在线观看| 欧美精品videos另类日本| 亚洲男人天堂2023| 国产区精品视频| 久久免费国产视频| 成人激情视频网| 欧美激情欧美激情| 国模私拍视频一区| 国产精品视频网站| 欧美激情一区二区三级高清视频| 国产精品www网站| 亚洲精品ady| 成人免费淫片视频软件| 欧美精品成人在线| 九九热视频这里只有精品| 亚洲欧美日韩精品久久亚洲区| 成人有码视频在线播放| 国产精品成人aaaaa网站| 国产成人精品免高潮在线观看| 精品动漫一区二区| 欧美极品xxxx| 成人性生交大片免费看小说| 欧美限制级电影在线观看| 欧美午夜视频在线观看| 日韩在线视频二区| 欧美限制级电影在线观看| 久久久久亚洲精品成人网小说| 影音先锋欧美在线资源| 国产精品96久久久久久又黄又硬| 亚洲第一av在线| 国产精品久久久久一区二区| 亚洲一级免费视频| 国产精品三级在线| 欧美日本亚洲视频| 91精品国产色综合久久不卡98| 久久精品小视频| 国产精品美女久久久久久免费| 国产精品女视频| 久久亚洲影音av资源网| 亚洲欧美在线一区| 国产亚洲一级高清| 亚洲第一页在线| 国产精品美女免费视频| 久久综合伊人77777尤物| 亚洲国产精品悠悠久久琪琪| 国产成人黄色av| 国产精品一区久久久| 欧美精品做受xxx性少妇| 激情av一区二区| 91久久久亚洲精品| 日韩影视在线观看| 欧美寡妇偷汉性猛交| 国产一区二区三区在线观看网站| 亚洲天堂免费在线| 热久久免费国产视频| 国产精品狠色婷| 国产欧美日韩精品专区| 成人免费观看网址| 欧美丰满片xxx777| 亚洲男人天堂古典| 麻豆国产va免费精品高清在线| 欧美大片在线免费观看| 久久91精品国产91久久久| 国产欧美欧洲在线观看| 久久精品一本久久99精品| 欧美丝袜一区二区| 在线精品国产欧美| 国产一区二区av| 欧美专区在线播放| 黑人巨大精品欧美一区二区| 欧美视频第一页| 亚洲第一视频网| 国产一区二区三区高清在线观看| 欧美激情综合色综合啪啪五月| 国内精品模特av私拍在线观看| 91精品国产91久久久久久最新| 亚洲欧美国产va在线影院| 清纯唯美亚洲激情| 久久av资源网站| 亚洲视频在线播放| 国产精品久久久久久久久免费| 国产一区二区三区在线免费观看| 国产日本欧美一区| 欧美一级电影在线| 亚洲欧美日韩直播| 伊人精品在线观看| 国产欧美 在线欧美| 视频在线一区二区| 一区二区三区国产视频| 欧美午夜丰满在线18影院| 91超碰中文字幕久久精品| 亚洲综合国产精品| 国产免费亚洲高清| 国产精品网红直播| 国产日本欧美一区二区三区在线| 亚洲美女视频网站| 国产精品极品美女在线观看免费| 亚洲美女动态图120秒| 欧美华人在线视频| 日韩高清欧美高清| 成人欧美一区二区三区在线| 色偷偷88888欧美精品久久久| 美女av一区二区三区| 中文字幕无线精品亚洲乱码一区| 欧美日韩国产综合视频在线观看中文| 日韩中文字幕免费看| 亚洲精选中文字幕| 欧美日韩爱爱视频| 亚洲老司机av| 亚洲美女精品成人在线视频| 成人av电影天堂| 亚洲最大成人网色| 午夜免费在线观看精品视频| 亚洲成成品网站| 亚洲人成在线免费观看| 日韩中文在线中文网在线观看| 欧美激情一区二区三级高清视频| 成人国产亚洲精品a区天堂华泰| 亚洲美女av网站| 另类少妇人与禽zozz0性伦| 亚洲第一在线视频| 国产精品久久久久久超碰| 欧美一级片免费在线| 日本精品va在线观看| 欧美有码在线观看| 在线日韩第一页| 96精品视频在线| 最近中文字幕2019免费|