標籤:
2.2結構體類型的變數、數組和指標變數的定義
可以用以下四種方式定義結構體類型的變數、數組和指標變數:
(1)緊跟在結構體類型說明之後進行定義。例如:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
} std, pers[3], *pstd;
此處,在說明結構體類型 struct student 的同時,定義了一個結構體變數 std、有3個變數的結構體數組 pers 和基底類型為結構體類型的指標變數 pstd。
(2)在說明一個無名結構體類型的同時,直接進行定義。如:上述定義的結構體中可以把 student 省略,寫成:
struct
{...
} std, pers[3], *pstd;
這種方式與前一種的區別僅僅是省略了結構體標識名,通常用在不需要再次定義此類型結構體變數的情況。
(3)先說明結構體類型,再單獨進行變數定義。如:
struct student
{...
};
struct student std, pers[3], pstd;
此處,先說明了結構體類型 struct student,再由一條單獨的語句定義變數 std、數組 pers 和指標變數 pstd。使用這種定義方式應注意:關鍵字 struct 必須和結構體標識名 student 共同說明結構體類型。
(4)使用 typedef 說明一個結構體類型名,再用新類型名來定義變數。如:
typedef struct
{
char name[12];
char sex;
struct date birthday;
float sc[4];
} STREC;
STREC std, pers[3], *pstd;
STREC 是一個具體的結構體類型名,它能夠唯一地標識這種結構體類型。因此,它可以用來定義變數,如同使用 int 、char 一樣,不可再寫關鍵字 struct。
2.3 給結構體變數、數組賦初值
和一般變數、數組一樣,結構體變數和數組也可以在定義的同時賦初值。
2.3.1 給結構體變數賦初值
所賦初值放在一對花括弧中,如:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
} std = {"Li Ming", ‘M’, 1997, 5, 10, 88.0, 76.0, 85.5, 90.0};
賦初值後,變數 std 內容:
name sex birthday sc[0] sc[1] sc[2] sc[3]
year month day
| Li Ming |
M |
1997 |
5 |
10 |
88.0 |
76.0 |
85.5 |
90.0 |
對結構體變數賦值時,C 編譯器按每個成員在結構中的順序一一對應賦初值,不允許跳過前面的成員給後面的成員賦初值。但可以只給前面的若干成員賦初值,對後面未賦初值的成員,系統將自動為數值型和字元型資料賦初值0。
2.3.2 給結構體數組賦初值
由於數組中每個元素都是一個結構體,因此通常將其成員的值依次放在一對花括弧中,以便區分各個元素。
struct bookcard
{
char num[5];
float money;
} bk[3] = { {"NO.1", 35.5}, {"NO.2", 25.0}, {"NO.3", 66.7} };
/* bk[0] bk[1] bk[2] */
也可以通過這種賦初值的方式,隱含確定結構體數組的大小。即:由編譯器根據所賦初值的成員個數決定數組元素的個數。以下是一個給二維數組賦初值的例子:
struct
{
char ch;
int i;
float x;
} arr[2][3] = {
{ {"a", 1, 3.0e10}, {"a", 2, 4.0e10}, {"a", 3, 5.0e10} }, /*第一行*/
{ {"b", 1, 6.0e10}, {"b", 2, 7.0e10}, {"b", 3, 8.0e10} } /*第二行*/
};
根據花括弧的嵌套關係,可以清楚的分辨出所賦初值與數組元素一一對應的關係。
2.3.3 相同類型結構體變數之間的整體賦值
ANSI C 標準允許相同類型的結構體變數之間進行整體賦值。如:
struct
{
char name[10];
int num;
} per1, per2 = {"Jhon", 46};
執行指派陳述式:per1 = per2; 則 per2 中每個成員的值都賦給了 per1 中對應的同名成員。這種賦值方法必須要保證賦值號兩邊結構體變數的類型相同。
結構體、共用體和使用者定義型別(2)