結構體指標和陣列的使用
阿新 • • 發佈:2018-12-10
同種型別的結構體是可以進行賦值的
【1】結構體陣列 (1)結構體陣列的定義 1)具有相同結構體型別的結構體變數也可以組成陣列,稱它們為結構體陣列。 結構體陣列的每一個數組元素都是結構體型別的資料,它們都分別包括各個成員(分量)項。 2)定義結構體陣列的方法和定義結構體變數的方法相仿,只需說明其為陣列即可。 可以採用三種方法: a. 先定義結構體型別,再用它定義結構體陣列。 結構體陣列的定義形式如下: struct 結構體名 { 成員表列; }; struct 結構體名 例如: struct student { char name[20]; char sex; int age; char addr[20]; }; struct student stu[3]; b. 在定義結構體型別同時定義結構體陣列。 結構體陣列的定義形式如下: struct 結構體名 { 成員表列; }陣列名[元素個數]; 例如: struct student { char name[20]; char sex; int age; char addr[20]; }stu[3]; c. 直接定義結構體陣列 結構體陣列的定義形式如下: struct //沒有結構體名 { 成員表列; }陣列名[元素個數]; 例如: struct { char name[20]; char sex; int age; char addr[20]; }stu[3]; (2)結構體陣列的初始化 結構體陣列在定義的同時也可以進行初始化,並且與結構體變數的初始化規定相同, 只能對全域性的或靜態儲存類別的結構體陣列初始化。 結構體陣列初始化的一般形式是: struct 結構體名 { 成員列表; }; struct 結構體名 陣列名[元素個數]={初始資料表}; 或者: struct 結構體名 { 成員表列; }陣列名[元素個數]={初始資料表}; 由於結構體變數是由若干不同型別的資料組成,而結構體陣列又是由若干結構體變數組成。 所以要特別注意包圍在大括號中的初始資料的順序,以及它們與各個成員項間的對應關係。 (3)結構體陣列的使用 一個結構體陣列的元素相當於一個結構體變數,因此前面介紹的有關結構體變數的規則也適應於結構體陣列元素。 以上面定義的結構體陣列stu[3]為例說明對結構體陣列的引用: 1)引用某一元素中的成員。 若要引用陣列第二個元素的name成員,則可寫為: stu[1].name 2)可以將一個結構體陣列元素值賦給同一結構體型別的陣列中的另一個元素,或賦給同一型別的變數。 如: struct student stu[3],student1; 現在定義了一個結構體型別的陣列,它有3個元素,又定義了一個結構體型別變數student1,則下面的賦值是合法的。 student1=stu[0]; stu[0]=stu[1]; stu[1]=student1; 3)不能把結構體陣列元素作為一個整體直接進行輸入輸出。如: printf(“…”,stu[0]); 或 scanf(“…”,&stu[0]); 都是錯誤的。 只能以單個成員為物件進行輸入輸出,如: scanf(“…”,stu[0].name); scanf(“…”,&stu[1].num); printf(“…”,stu[0].name); printf(“…”,stu[1].num); (4)結構體指標 可以設定一個指標變數用來指向一個結構體變數。此時該指標變數的值是結構體變數的起始地址,該指標稱為結構體指標。 結構體指標與前面介紹的各種指標變數在特性和方法上是相同的。與前述相同,在程式中結構體指標也是通過訪問目標運算“*”訪問它的物件。 結構體指標在程式中的一般定義形式為: struct 結構體名 *結構指標名; 其中的結構體名必須是已經定義過的結構體型別。 例如, 對於上一節中定義的結構體型別struct student, 可以說明使用這種結構體型別的結構指標如下: struct student *pstu; 其中pstu是指向struct student結構體型別的指標。結構體指標的說明規定了它的資料特性,併為結構體指標本身分配了一定的記憶體空間。 但是指標的內容尚未確定,即它指向隨機的物件。 當表示指標變數p所指向的結構體變數中的成員時,“(*結構體指標名).成員名”這種表示形式總是需要使用圓括號,顯得很不簡煉。 因此,對於結構體指標指向的結構體成員項,給出了另外一種簡潔的表示方法,如下表示: 結構體指標名->成員名 它與前一種表示方法在意義上是完全等價的。 例如,結構體指標p指向的結構體變數中的成員name可以表示如下: (*p).name 或 p->name