1. 程式人生 > >11、C語言之結構體和共用體

11、C語言之結構體和共用體

結構體數組 結構體 float add font sco 規則 student mon

一、結構體

  結構體:是一種自定義構造數據類型

  用途:把不同類型的數據組合成一個整體。

    結構體類型定義:

    struct [結構體名]

   {

      類型識別符 成員名;

      類型識別符 成員名;

      ……

    };(記住分號不可少)

    eg:

    struct student

   {

      int num;

      char name[20];

      char sex;

      int age;

      float score;

      char addr[20];

    }stu1,str2;(stu1,stu2為結構體變量)

  說明:

    結構體類型與結構體變量概念不同

      類型:不分配內存 變量:分配內存;

      類型:不能賦值、存取、運算 變量:可以;

    結構體變量中的成員可單獨使用,方法如普通變量;

    結構體可嵌套;

      eg:

        struct date

        {

          int month;

          int day;

          int year;

        };

        struct student

        {

          int num;

          char name[20];

          struct date birthday;

        }stu;

    結構體成員名與程序中變量名可相同,兩者不代表同一個對象。

    結構體變量的引用:

    引用規則

      結構體變量不能整體引用,只能引用變量成員

        結構體變量名.成員名。

        stu.age = 20;

  結構體的正確用法:

 1 #include<stdio.h>
 2 void main()
 3 {
 4     struct student
 5     {
 6         int No;
 7         float score;
8 char name[20]; 9 }stu; 10 scanf("%d,%f,%s",&stu.No,&stu.score,&stu.name); 11 printf("%d,%2.2f,%s",stu.No,stu.score,stu.name); 12 }

  結構體初始化的方式:

  (1)struct 結構體名

    {

      類型標識符 成員名1;

      類型標識符 成員名2;

    };

    struct 結構體名 結構體變量={初始化數據};  

   (2)struct 結構體名

      {

        類型標識符 成員名1;

        類型標識符 成員名2;

      }結構體變量={初始化數據};

   

  結構體數組:

  具有相同結構的結構體也可以組成數組

  定義結構體數組:三種形式

   (1)間接定義

    struct student

    {

      int num;

      char name[20];

      int age;

      char sex;

    };

    struct student stu[2];

  指向結構體類型數據的指針

    存放結構體首地址

    結構體的運算按照C語言的地址運算原則進行,  

    例如,結構指針加1,將指向內存中下一個結構體

    指向結構體變量的指針

    定義形式:  struct 結構體名 *結構體指針名;

struct student
{
    int num;
    char name[20];
    char sex;
    int age;
}stu;
struct student *p = &stu;

  結構體變量指針的使用,以下三種形式時等價的:

    stu.num = 101;

    (*p).num=101;//括號不能少

    p->num=101;

  用法舉例:

 1 #include<stdio.h>
 2 #include<string.h>
 3 void main()
 4 {
 5     struct student
 6     {
 7         long int num;
 8         char name[20];
 9         char sex;
10         float score;
11     }stu_1,*p;
12     p=&stu_1;
13     stu_1.num = 89001;
14     strcpy(stu_1.name,"lilei");
15     (*p).sex = M;
16     p->score = 89.5;
17     printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,p->name,stu_1.sex,p->score);
18 }

二、共用體

  共用體概念:

    構造數據類型,也叫聯合體

    用途:使幾個不同類型的變量共占一段內存(相互覆蓋)

    類型定義形式:

      union 共用體名

      {

        類型標識符 成員名;

        類型標識符 成員名;

      };

      eg:

      union data

      {

        int i;

        char ch;

        float f;

      }a,b,*p,d[3];(與結構體類似)

    說明:共同體變量任何時刻只有一個成員存在。共用體變量定義分配內存,長度=最長成員所占字節數

  共用體變量的引用方式

    三種方式等價:

      共用體變量名.成員名

      共用體指針名->成員名

      (*共用體指針名).成員名

  共用體類型數據的特點:

    (1)同一個內存段可以用來存放幾種不同的成員,但在每一瞬間,只能存放其中一種,而不是同時存放幾種

    (2)共用體變量中起作用的成員是最後一次存放的成員

    (3)共用體變量和它的各成員的地址都是同一地址

三、枚舉類型

  枚舉類型時ANSI C新標準所增加的。

  如果一個變量只有幾種可能的值,可以定義為枚舉類型。所謂枚舉是指將變量的值一一列舉出來,變量的值只限於列舉出來的值的範圍內。

  枚舉類型及其變量的定義形式:

    enum 枚舉類型名 {枚舉元素列表} 枚舉變量列表;

    可以先聲明類型再定義變量,或同時進行或直接定義變量。

      eg:

        enum weekday {sun,mon,tue,wed,thu,fri,sat};

        enum weekday workday,week_end;

        或

        enum weekday {sun,mon,tue,wed,thu,fri,sat} workday,week_end;

      其中,sun,mon……sat等為枚舉元素或枚舉常量。它們時用戶定義的標識符。

      說明:

        在編譯時,對枚舉元素按常量處理,它們不是變量,不能對他們賦值。

        枚舉元素作為常量,它們時有值的,語言編譯按定義時的順序使他們的值為0,1,2……

        枚舉值可用用來做判斷比較:

          eg:

            if(workday == mon)……

            if(workday >sun)……

        一個整數不能直接賦給一個枚舉變量,應該先進行強制類型轉換才能賦值。

          eg:workday = (enum weekday)2;

四、用typedef定義類型

  功能:用自定義名字為已有數據類型命名

  類型定義簡單形式:typedef type name;

    type:已有數據類型

    name:給type定義的別名

  說明:

    1、typedef沒有創造新數據類型

    2、typedef時定義類型,不能定義變量

    3、typedef與define不同

  typedef定義類型步驟:

    1、按定義變量方法寫出定義體 如 int i;

    2、將變量名換成新類型名 int INTERGER;

    3、最前面加typedef 如typedef int INTERGER

    4、用新類型名定義變量 如 INTERGER i,j;

  類型定義可以嵌套

11、C語言之結構體和共用體