C語言程序設計(第7章結構體與共用體)

字號:

7.1 結構體類型變量的定義和引用
    在上面描述的各種登記表中,讓我們仔細觀察一下住宿表、成績表、通訊地址等。
    住宿表由下面的項目構成:
    這些登記表用C提供的結構體類型描述如下:
    住宿表:
    struct accommod
    {
     char name[20]; /*姓名*/
     char sex; /*性別*/
     char job[40]; /*職業(yè)*/
     int age; /*年齡*/
     long number; /*身份證號碼*/
    } ;
    成績表:
    struct score
    {
     char grade[20]; /* 班級*/
     long number; /* 學號*/
     char name[20]; /*姓名*/
     float os; /*操作系統(tǒng)*/
     float datastru; /* 數(shù)據(jù)結構*/
     float compnet; /* 計算機網絡*/
    } ;
    通訊地址表:
    struct addr
    {
     char name[20];
     char department[30];/* 部門*/
     char address[30]; /*住址*/
     long box; /* 郵編*/
     long phone; /* 電話號碼*/
     char email[30]; /* Email */
    };
     這一系列對不同登記表的數(shù)據(jù)結構的描述類型稱為結構體類型。由于不同的問題有不同的數(shù)據(jù)成員,也就是說有不同描述的結構體類型。我們也可以理解為結構體類型根據(jù)所針對的問題其成員是不同的,可以有任意多的結構體類型描述。
    下面給出C對結構體類型的定義形式:
    struct 結構體名
    {
     成員項表列;
    };
     有了結構體類型,我們就可以定義結構體類型變量,以對不同變量的各成員進行引用。
    7.1.1 結構體類型變量的定義
     結構體類型變量的定義與其它類型的變量的定義是一樣的,但由于結構體類型需要針對問題事先自行定義,所以結構體類型變量的定義形式就增加了靈活性,共計有三種形式,分別介紹如下:
    1) 先定義結構體類型,再定義結構體類型變量:
    struct stu / *定義學生結構體類型* /
    {
     char name[20]; /* 學生姓名*/
     char sex; /* 性別*/
     long num; /*學號*/
     float score[3]; /* 三科考試成績*/
    };
    struct stu student1,student2;/* 定義結構體類型變量*/
    struct stu student3,student4;
     用此結構體類型,可以定義更多的該結構體類型變量。
    2 ) 定義結構體類型同時定義結構體類型變量:
    struct data
    {
     int day;
     int month;
     int year;
    } time1,time2;
     也可以再定義如下變量:
    struct data time3,time4;
     用此結構體類型,同樣可以定義更多的該結構體類型變量。
    3) 直接定義結構體類型變量:
    struct
    {
     char name[20]; /*學生姓名*/
     char sex; /*性別*/
     long num; /*學號*/
     float score[3]; /*三科考試成績*/
    } person1,person2; /*定義該結構體類型變量* /
     法由于無法記錄該結構體類型,所以除直接定義外,不能再定義該結構體類型變量。
    7.1.2 結構體類型變量的引用
     學習了怎樣定義結構體類型和結構體類型變量,怎樣正確地引用該結構體類型變量的成員呢?C 規(guī)定引用的形式為:
     類型變量名> . <成員名>
     若我們定義的結構體類型及變量如下:
    struct data
    {
     int day;
     int month;
     int year;
    } time1,time2;
     則變量time1和time2各成員的引用形式為:time1.day、time1.month、time1.year及time2.day、time2.month、time2.yea r,如圖7 - 1所示。
     類型變量的各成員與相應的簡單類型變量使用方法完全相同。
    7.1.3 結構體類型變量的初始化
     由于結構體類型變量匯集了各類不同數(shù)據(jù)類型的成員,所以結構體類型變量的初始化就略顯復雜。
    結構體類型變量的定義和初始化為:
    struct stu / *定義學生結構體類型* /
    {
     char name[20]; / * 學生姓名* /
     char sex; / * 性別* /
     long num; / *學號* /
     float score[3]; / * 三科考試成績* /
    };
    struct stu student={"liping",'f',970541,98.5,97.4,95};
     上述對結構體類型變量的三種定義形式均可在定義時初始化。結構體類型變量完成初始化后,即各成員的值分別為: student.name = "liping"、student.sex = 'f'、student.num = 970541、student.sco re[0] = 98.5、student.score[1] = 97.4、student.score[2] = 95。其存儲在內存的情況如圖7 - 2所示。
     我們也可以通過C提供的輸入輸出函數(shù)完成對結構體類型變量成員的輸入輸出。由于結構體類型變量成員的數(shù)據(jù)類型通常是不一樣的,所以要將結構體類型變量成員以字符串的形式輸入,利用C的類型轉換函數(shù)將其轉換為所需類型。類型轉換的函數(shù)是:
     int atoi( char *str);轉換str所指向的字符串為整型,其函數(shù)的返回值為整型。
     double atof(char *str);轉換str所指向的字符串為實型,其函數(shù)的返回值為雙精度的實型。
     long atol(char *str);轉換str所指向的字符串為長整型,其函數(shù)的返回值為長整型。
     使用上述函數(shù),要包含頭文件"stdlib.h"。
     對上述的結構體類型變量成員輸入采用的一般形式:
    char temp[20];
    gets(student.name); /* 輸入姓名*/
    student.sex = getchar( ); /* 輸入性別*/
    gets(temp); /*輸入學號*/
    student.num = atol(temp); /* 轉換為長整型*/
    for( i = 0; i < 3; i ++) /*輸入三科成績*/
    {
     gets(temp);
     student.score[i] = atoi(temp);
    }
     對該結構體類型變量成員的輸出也必須采用各成員獨立輸出,而不能將結構體類型變量以整體的形式輸入輸出。
    C允許針對具體問題定義各種各樣的結構體類型,甚至是嵌套的結構體類型。
    struct data
    {
     int day;
     int mouth;
     int year;
    };
    struct stu
    {
     char name[20];
     struct data birthday; /* 出生年月,嵌套的結構體類型*/
     long num;
    } person;
     該結構體類型變量成員的引用形式: person.name 、person.birthday.day、person. birthday.month、person. birthday.year、person.num 。