············目標········
·掌握結構體類型的定義
·掌握結構體變量的定義及初始化
·掌握結構體變量的操做
·掌握結構體數組的使用
·結構體指針的定義及使用數組
·
1.結構體類型的定義
語法:定義結構體類型的通常形式以下函數
struct 結構體類型名
{
數據類型1 成員1 ;
數據類型2 成員2 ; 指針
數據類型n 成員n ;
} ;
語義:定義一個含有n個成員的結構體類型。注意編譯器不爲類型分配存儲空間
例:定義結構體類型DateType表示年、月、日等信息。
struct DateType
{
int year ;
int month ;
int day ;
};
結構體類型能夠嵌套定義,例如 :
struct StudentType
{
char name[20];
char gender[3];
struct DateType birthday ; //struct DateType是已定義的類型
};編譯器
2.結構體變量的定義
語法:定義結構體變量的通常形式以下:
(1)先定義結構體類型,再定義結構體變量
struct 結構類型名 變量名列表 ;
(2)在定義結構體類型的同時定義結構體變量
struct 結構類型名
{
成員列表
} 變量名列表 ;
語義:定義變量名列表中的變量爲結構體類型,編譯器爲結構體變量分配存儲空間。 編譯
struct DateType //先定義結構體類型
{
int year, month, day;
};
struct DateType birthday; //再定義結構體變量birthday變量
struct DateType
{
int year, month, day;
} birthday; //在定義結構體類型的同時定義結構體變量birthday
3.結構體變量的引用數據類型
語法:引用結構體變量的通常形式以下:
結構變量名. 成員名語法
·結構體變量的初始化
(1)先定義結構體類型,再定義結構體變量並賦初值
struct 結構體類型名 變量名 = {成員1的初值,……,成員n的初值} ;引用
(2)在定義結構體類型的同時定義結構體變量並賦初值
struct 結構體類型名
{
聲明成員類型
} 變量名 = {成員1的初值,……,成員n的初值} ;
語義:定義結構體變量並初始化。
例:struct DateType
{
int year;
int month;
int day;
};
struct DateType birthday = {1968, 3, 26};程序
struct DateType
{
int year;
int month;
int day;
} birthday = {1968, 3, 26};
·結構體變量的操做
1. 輸入/輸出操做
在C語言中,結構體變量不能做爲scanf函數和printf函數的實參,換言之,不能總體讀入一個結構體變量,也不能總體輸出一個結構體變量,只能對結構體變量的各個成員進行輸入/輸出操做。
struct DateType birthday;
scanf ("%d%d%d", &birthday.year, &birthday.month, &birthday.day );
printf("%d-%d-%d", birthday.year, birthday.month, birthday.day );
2. 賦值操做:
在程序中爲其各個成員逐一賦值,但不能總體賦值。
struct DateType birthday;
birthday = {1997, 1, 4};
這是錯誤的!
正確的應該是:
struct DateType birthday1 = {1997, 1, 4}, birthday2;
birthday2 = birthday1;
若是兩個結構體變量的類型相同,程序中能夠進行總體賦值。
3. 其餘操做:
C語言沒有定義施加於結構體類型上的運算,對結構體變量的操做是經過對其成員的操做實現的。
本質上,結構體變量的成員是一個簡單變量,所以,其成員的使用方法與同類型簡單變量的使用方法相同。
struct DateType birthday1 = {1968, 3, 26}, birthday2;
int year;
birthday2.year = 1963;
year = birthday1.year - birthday2.year; //兩個結構體變量相差的年數
·結構體數組
1·結構體數組變量的定義
struct StudentType
{
char no[10] ;
char name[10] ;
double foreign ;
double spec1 ;
double spec2 ;
} ;
struct StudentType stud[10] ;
(1)結構體數組的引用
語法:引用結構體數組的通常形式以下:
結構體數組名[下標].成員名
語義:引用結構體數組的具體成員。
(2)結構體數組變量的初始化
struct StudentType
{
char no[10];
char name[10];
double foreign;
double spec1;
double spec2;
} stud[10] ={{001, 陸宇, 87, 67, 88}, {002, 李明, 68, 85, 78}};
struct StudentType stud[10] ={{001, 陸宇, 87, 67, 88}, {002, 李明, 68, 85, 78}};
2·結構體數組元素的操做
因爲結構體數組的每一個元素都是一個結構體類型的數據,所以結構體數組元素的使用方法與結構體變量的使用方法相同,結構體數組元素每一個成員的使用方法與同類型簡單變量的使用方法相同。
struct StudentType stu[5] ={{0001, 陸宇, 87, 67, 88}};
stu[1] = stu[0]; /*結構體數組元素之間能夠直接賦值*/
stu[2].foreign = 98;
strcpy(stu[2].name, "王奇");
printf("外語成績的差是%6.2f\n", stu[2].foreign - stu[1].foreign);
·結構體指針的定義及使用
其中,結構體類型是一個已定義或正在定義的結構體類型;指針變量名是一個合法的標識符。
語義:定義一個指針指向結構體類型。
定義一個結構體指針後,須要將該指針與一個結構體變量的地址綁定,例如,以下語句聲明並初始化了一個指向結構體的指針p。
struct DateType
{
int year, month, day;
};
struct DateType birthday = {1968, 3, 26};
struct DateType *p = &birthday;
經過指針訪問結構體成員
A.(*指針).成員
其中,「*指針」必定要用括號括起來,由於成員運算符「.」的優先級高於間接引用運算符「*」的優先級。
B.指針->成員
語義:經過結構體指針引用結構體變量的某個具體成員。
例:struct DateType
{
int year, month, day;
};
struct DateType birthday = {1968, 3, 26};
struct DateType *p = &birthday;
printf("%4d-%2d-%2d\n", p->year, p->month, p->day);
注意:結構體指針做爲函數參數
將結構體變量傳遞給函數,可有三種方法:
形參是結構體成員,實參是對應結構體成員的值,參數傳遞是將結構體成員的值傳遞給形參。
形參是結構體變量,實參是結構體變量的值,參數傳遞是將結構體變量的值傳遞給形參。
形參是指向結構體類型的指針,實參是結構體變量的地址或指向結構體變量的指針,參數傳遞是將結構體變量的首地址傳遞給形參。
前兩種方法屬於值傳遞方式,結構體規模較大時,空間和時間的開銷很大,通常較少使用。
/*大學一路C*/