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

首頁 > 編程 > C > 正文

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

2020-01-26 14:48:16
字體:
來源:轉載
供稿:網友

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

結構是用來代表一個記錄,假設要跟蹤圖書館的書籍??赡芤櫽嘘P每本書以下屬性:

  • 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
亚洲18私人小影院| 日韩黄在线观看| xxx成人少妇69| 亚洲国产精品中文| 亚洲天堂av综合网| 97国产精品人人爽人人做| 97视频在线观看免费| 日韩av日韩在线观看| 欧美大片在线影院| 国产精品免费一区二区三区都可以| 色综合91久久精品中文字幕| 精品福利在线观看| 亚洲国产日韩欧美在线图片| 欧美一区视频在线| 欧美性猛交99久久久久99按摩| 欧美午夜片欧美片在线观看| 91精品久久久久久久| 激情久久av一区av二区av三区| 亚洲国产欧美自拍| 成人午夜两性视频| 91老司机精品视频| 日本在线精品视频| 亚洲精品免费网站| 亚洲国产欧美自拍| 亚洲网站在线观看| 国产精品免费一区二区三区都可以| 亚洲a级在线观看| 亚洲国产精品热久久| 欧美电影免费看| 国产精品国内视频| 国产精品99久久久久久www| 亚洲tv在线观看| 91国产高清在线| 精品福利在线看| 国产精品精品久久久| 亚洲国产精品电影| 69**夜色精品国产69乱| 亚洲精选在线观看| 国产欧美日韩精品专区| 欧美韩日一区二区| 国产久一一精品| 这里只有视频精品| 国产成人拍精品视频午夜网站| 欧美最顶级丰满的aⅴ艳星| 国产精品1234| 日韩欧美国产激情| 一区二区在线免费视频| 精品偷拍一区二区三区在线看| 岛国视频午夜一区免费在线观看| 日韩一区视频在线| 国产在线98福利播放视频| 欧美麻豆久久久久久中文| 这里精品视频免费| 久久精视频免费在线久久完整在线看| 国产高清视频一区三区| 精品国产欧美一区二区三区成人| 色偷偷亚洲男人天堂| 亚洲综合中文字幕在线观看| 亚洲视频在线观看免费| 91免费视频网站| 日韩欧美成人精品| 国产999精品视频| 欧美激情xxxx性bbbb| 国产在线不卡精品| 色偷偷av一区二区三区| 色综合久久88色综合天天看泰| 精品成人乱色一区二区| 97香蕉久久夜色精品国产| 久久成人国产精品| 社区色欧美激情 | 亚洲国内精品视频| 亚洲黄色www| 韩国三级电影久久久久久| 久久成人精品电影| 日韩国产一区三区| www.美女亚洲精品| 欧美性受xxxx黑人猛交| 久久97精品久久久久久久不卡| 国产精品视频资源| 中文字幕av一区二区三区谷原希美| 亚洲欧美国产日韩天堂区| 97香蕉超级碰碰久久免费的优势| 色综合影院在线| 色综合久久88色综合天天看泰| 久久精品夜夜夜夜夜久久| 中日韩美女免费视频网站在线观看| 北条麻妃一区二区三区中文字幕| 91啪国产在线| 中文字幕免费精品一区| 成人免费看黄网站| 日韩精品高清在线| 欧美激情一级精品国产| 中文字幕亚洲无线码在线一区| 亚洲国产精品国自产拍av秋霞| 亚洲国产小视频在线观看| 日韩av在线高清| 26uuu日韩精品一区二区| 欧洲成人免费视频| 日韩在线观看免费| 亚洲精品日韩av| 黑人巨大精品欧美一区二区| 日韩欧美精品在线观看| 欧美性xxxxxxx| 久久99国产精品久久久久久久久| 欧美日韩免费网站| 欧美大码xxxx| 亚洲在线免费看| 精品国产一区二区三区在线观看| 亚洲欧美一区二区三区四区| 亚洲夜晚福利在线观看| 国产日韩精品综合网站| 亚洲欧洲高清在线| 91精品国产综合久久香蕉最新版| 国产精品免费视频xxxx| 国产成人在线视频| 久久久精品免费| 欧美最顶级的aⅴ艳星| 久久久久久国产精品三级玉女聊斋| 国语自产精品视频在免费| 亚洲黄色片网站| 欧美一区二三区| 成人国产精品久久久久久亚洲| 国产亚洲精品激情久久| 性色av一区二区三区免费| 亚洲一区二区三区xxx视频| 国产午夜精品免费一区二区三区| 亚洲福利视频免费观看| 亚洲xxxxx电影| 中文字幕亚洲一区在线观看| 91地址最新发布| 亚洲精品国偷自产在线99热| 国产精品亚洲片夜色在线| 欧美日韩国产中文精品字幕自在自线| 欧美精品电影免费在线观看| 欧美午夜影院在线视频| 日韩美女av在线| 日韩中文字幕国产精品| 精品久久久久久久久中文字幕| 色悠悠久久88| 91po在线观看91精品国产性色| 欧美国产极速在线| 久久免费在线观看| 欧美激情一二三| 亚洲四色影视在线观看| 久久人人爽人人爽人人片av高清| 国产日韩欧美成人| 欧美成人中文字幕| 亚洲精品日韩av| 国产在线一区二区三区| 精品调教chinesegay| 国产精品黄色av| 亚洲社区在线观看| 欧美大片免费看| 欧美一级在线播放| 97香蕉久久超级碰碰高清版| 亚洲欧美国产精品va在线观看| 国产精品激情av在线播放| 成人美女av在线直播| 日本精品久久电影| 欧美国产亚洲精品久久久8v| 97香蕉超级碰碰久久免费软件| 成人国产精品日本在线| 日韩av在线最新| 久久久久久久色|