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 。
在上面描述的各種登記表中,讓我們仔細觀察一下住宿表、成績表、通訊地址等。
住宿表由下面的項目構成:
這些登記表用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 。