機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
學(xué)C51的基礎(chǔ) 10《 聯(lián) 合(union) 》作者[cmh]©
學(xué)C51的基礎(chǔ) 10《 聯(lián) 合(union) 》作者[cmh]©
 更新時(shí)間:2008-8-17 16:34:08  點(diǎn)擊數(shù):42
【字體: 字體顏色

          {
               printf("\nName:");
               scanf("%s", a.name);     /*輸入姓名*/
               printf("Age:");
               scanf("%d", &a.wage);    /*輸入年齡*/
               printf("Sex:");
               scanf("%d", a.sex);
               printf("Dept:");
               scanf("%s", a.depart);
               printf("Wage1:");
               scanf("%f", &a.wage1);   /*輸入工資*/
               printf("Wage2:");
               scanf("%f", &a.wage2);
               printf("Wage3:");
               scanf("%f", &a.wage3);
               printf("Wage4:");
               scanf("%f", &a.wage4);
               printf("Wage5:");
               scanf("%f", &a.wage5);
               wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
               printf("The sum of wage is %6.2f\n", wage);      /*顯示結(jié)果*/
               fprintf(fp, "%10s%4d%4s%30s%10.2f\n",            /*結(jié)果寫入文件*/
                            a.name, a.age, a.sex, a.depart, wage);
               while(1)
               {
                    printf("Continue?");
                    c=getche();
                    if(c=='Y' c=='y' c=='N' c=='n')
                         break;
               }
          }
          fclose(fp);
     }


    3. 結(jié)構(gòu)數(shù)組和結(jié)構(gòu)指針
    結(jié)構(gòu)是一種新的數(shù)據(jù)類型, 同樣可以有結(jié)構(gòu)數(shù)組和結(jié)構(gòu)指針。
    一、結(jié)構(gòu)數(shù)組
    結(jié)構(gòu)數(shù)組就是具有相同結(jié)構(gòu)類型的變量集合。假如要定義一個(gè)班級(jí)40個(gè)同學(xué)的姓名、性別、年齡和住址, 可以定義成一個(gè)結(jié)構(gòu)
數(shù)組。如下所示:
     struct{
          char name[8];
          char sex[2];
          int age;
          char addr[40];
     }student[40];
    也可定義為:
     struct string{
          char name[8];
          char sex[2];
          int age;
          char addr[40];
     };
     struct string student[40];
    需要指出的是結(jié)構(gòu)數(shù)組成員的訪問是以數(shù)組元素為結(jié)構(gòu)變量的, 其形式為:
          結(jié)構(gòu)數(shù)組元素.成員名
    例如:
      student[0].name
      student[30].age
    實(shí)際上結(jié)構(gòu)數(shù)組相當(dāng)于一個(gè)二維構(gòu)造, 第一維是結(jié)構(gòu)數(shù)組元素, 每個(gè)元素是一個(gè)結(jié)構(gòu)變量, 第二維是結(jié)構(gòu)成員。
    注意:
    結(jié)構(gòu)數(shù)組的成員也可以是數(shù)組變量。
    例如:
     struct a
     {
          int m[3][5];
          float f;
          char s[20];
     }y[4];
    為了訪問結(jié)構(gòu)a中結(jié)構(gòu)變量y[2]的這個(gè)變量, 可寫成
       y[2].m[1][4]

    二、結(jié)構(gòu)指針
    結(jié)構(gòu)指針是指向結(jié)構(gòu)的指針。它由一個(gè)加在結(jié)構(gòu)變量名前的"*"操作符來定義, 例如用前面已說明的結(jié)構(gòu)定義一個(gè)結(jié)構(gòu)指針如下:
     struct string{
          char name[8];
          char sex[2];
          int age;
          char addr[40];
     }*student;
    也可省略結(jié)構(gòu)指針名只作結(jié)構(gòu)說明, 然后再用下面的語句定義結(jié)構(gòu)指針。
      struct string *student;
    使用結(jié)構(gòu)指針對(duì)結(jié)構(gòu)成員的訪問, 與結(jié)構(gòu)變量對(duì)結(jié)構(gòu)成員的訪問在表達(dá)方式上有所不同。結(jié)構(gòu)指針對(duì)結(jié)構(gòu)成員的訪問表示為:
       結(jié)構(gòu)指針名->結(jié)構(gòu)成員
    其中"->"是兩個(gè)符號(hào)"-"和">"的組合, 好象一個(gè)箭頭指向結(jié)構(gòu)成員。例如要給上面定義的結(jié)構(gòu)中name和age賦值, 可以用下面語
句:
     strcpy(student->name, "Lu G.C");
     student->age=18;
    實(shí)際上, student->name就是(*student).name的縮寫形式。
    需要指出的是結(jié)構(gòu)指針是指向結(jié)構(gòu)的一個(gè)指針, 即結(jié)構(gòu)中第一個(gè)成員的首地址, 因此在使用之前應(yīng)該對(duì)結(jié)構(gòu)指針初始化, 即分
配整個(gè)結(jié)構(gòu)長度的字節(jié)空間, 這可用下面函數(shù)完成, 仍以上例來說明如下:
     student=(struct string*)malloc(size of (struct string));
    size of (struct string)自動(dòng)求取string結(jié)構(gòu)的字節(jié)長度, malloc() 函數(shù)定義了一個(gè)大小為結(jié)構(gòu)長度的內(nèi)存區(qū)域, 然后將其
地址作為結(jié)構(gòu)指針返回。

    注意:
    1. 結(jié)構(gòu)作為一種數(shù)據(jù)類型, 因此定義的結(jié)構(gòu)變量或結(jié)構(gòu)指針變量同樣有局部變量和全程變量, 視定義的位置而定。
    2. 結(jié)構(gòu)變量名不是指向該結(jié)構(gòu)的地址, 這與數(shù)組名的含義不同, 因此若需要求結(jié)構(gòu)中第一個(gè)成員的首地址應(yīng)該是&[結(jié)構(gòu)變量
名]。
    4. 結(jié)構(gòu)的復(fù)雜形式
    一、嵌套結(jié)構(gòu)
    嵌套結(jié)構(gòu)是指在一個(gè)結(jié)構(gòu)成員中可以包括其它一個(gè)結(jié)構(gòu), Turbo C 允許這種嵌套。
    例如: 下面是一個(gè)有嵌套的結(jié)構(gòu)
     struct string{
          char name[8];
          int age;
          struct addr address;
     } student;
    其中: addr為另一個(gè)結(jié)構(gòu)的結(jié)構(gòu)名, 必須要先進(jìn)行, 說明, 即
     struct addr{
          char city[20];
          unsigned lon zipcode;
          char tel[14];
     }
    如果要給student結(jié)構(gòu)中成員address結(jié)構(gòu)中的zipcode賦值, 則可寫成:

      student.address.zipcode=200001;

    每個(gè)結(jié)構(gòu)成員名從最外層直到最內(nèi)層逐個(gè)被列出, 即嵌套式結(jié)構(gòu)成員的表達(dá)方式是:

      結(jié)構(gòu)變量名.嵌套結(jié)構(gòu)變量名.結(jié)構(gòu)成員名

    其中: 嵌套結(jié)構(gòu)可以有很多, 結(jié)構(gòu)成員名為最內(nèi)層結(jié)構(gòu)中不是結(jié)構(gòu)的成員名。

    二、位結(jié)構(gòu)
    位結(jié)構(gòu)是一種特殊的結(jié)構(gòu),在需按位訪問一個(gè)字節(jié)或字的多個(gè)位時(shí),位結(jié)構(gòu)比按位運(yùn)算符更加方便。
    位結(jié)構(gòu)定義的一般形式為:

     struct位結(jié)構(gòu)名{
          數(shù)據(jù)類型 變量名: 整型常數(shù);
          數(shù)據(jù)類型 變量名: 整型常數(shù);
     } 位結(jié)構(gòu)變量;

    其中: 數(shù)據(jù)類型必須是int(unsigned或signed)。 整型常數(shù)必須是非負(fù)的整數(shù), 范圍是0~15, 表示二進(jìn)制位的個(gè)數(shù), 即表示有
多少位。
    變量名是選擇項(xiàng), 可以不命名, 這樣規(guī)定是為了排列需要。
    例如: 下面定義了一個(gè)位結(jié)構(gòu)。

     struct{
          unsigned incon: 8;  /*incon占用低字節(jié)的0~7共8位*/
          unsigned txcolor: 4;/*txcolor占用高字節(jié)的0~3位共4位*/
          unsigned bgcolor: 3;/*bgcolor占用高字節(jié)的4~6位共3位*/
          unsigned blink: 1;  /*blink占用高字節(jié)的第7位*/
     }ch;

    位結(jié)構(gòu)成員的訪問與結(jié)構(gòu)成員的訪問相同。
    例如: 訪問上例位結(jié)構(gòu)中的bgcolor成員可寫成:

      ch.bgcolor

    注意:
    1. 位結(jié)構(gòu)中的成員可以定義為unsigned, 也可定義為signed, 但當(dāng)成員長度為1時(shí), 會(huì)被認(rèn)為是unsigned類型。因?yàn)閱蝹(gè)位不
可能具有符號(hào)。
    2. 位結(jié)構(gòu)中的成員不能使用數(shù)組和指針, 但位結(jié)構(gòu)變量可以是數(shù)組和指針, 如果是指針, 其成員訪問方式同結(jié)構(gòu)指針。
    3. 位結(jié)構(gòu)總長度(位數(shù)), 是各個(gè)位成員定義的位數(shù)之和,  可以超過兩個(gè)字節(jié)。
    4. 位結(jié)構(gòu)成員可以與其它結(jié)構(gòu)成員一起使用。
    例如:

     struct info{
          char name[8];
          int age;
          struct addr address;
          float pay;
          unsigned state: 1;
          unsigned pay: 1;
          }workers;'

    上例的結(jié)構(gòu)定義了關(guān)于一個(gè)工從的信息。其中有兩個(gè)位結(jié)構(gòu)成員, 每個(gè)位結(jié)構(gòu)成員只有一位, 因此只占一個(gè)字節(jié)但保存了兩個(gè)
信息, 該字節(jié)中第一位表示工人的狀態(tài), 第二位表示工資是否已發(fā)放。由此可見使用位結(jié)構(gòu)可以節(jié)省存貯空間。
  • 上一篇: C51 怎樣將1個(gè)子程序段定位在1個(gè)固定的地址位置?
  • 下一篇: 學(xué)C51的基礎(chǔ) 9 《 指針、結(jié)構(gòu)、聯(lián)合和枚舉 》 作者[cmh]©
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1