············目標········
·掌握結構體類型的定義
·掌握結構體變量的定義及初始化
·掌握結構體變量的操作
·掌握結構體數組的使用
·結構體指針的定義及使用
·
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*/
