結構體struct簡介(下)

本文整理自:
本文轉載自:
http://blog.csdn.net/hudashi/article/details/7400678
六、結構體指針變量 
   指向一個結構體的指針變量稱之爲結構體指針變量。 結構指針變量中的值是所指向的結構變量的首地址。 通過結構指針即可訪問該結構變量, 這與數組指針和函數指針的情況是相同的結構指針變量說明的一般形式爲:  
struct 結構名*結構指針變量名  
例如,在前面中定義了的stu這個結構體, 如要說明一個指向stu的指針變量pstu,可寫爲:  
struct stu *pstu;  
  當然也可在定義stu結構時同時說明pstu。與前面討論的各類指針變量相同,
結構指針變量也必須要先賦值後才能使用。賦值是把結構變量的首地址賦予該指針變量, 不能把結構體類型名賦予該指針變量。
如果boy是被說明爲stu類型的結構變量,則: pstu=&boy是正確的,而: pstu=&stu是錯誤的。 
  結構體類型名結構體變量是兩個不同的概念,不能混淆。 結構體類型名只能表示一個結構體的形式,編譯系統並不對它分配內存空間。 只有當某變量被說明爲這種類型的結構體時,纔對該變量分配存儲空間。 因此上面&stu這種寫法是錯誤的,不可能去取一個結構名的首地址。 
通過結構體指針變量,能方便地訪問結構體變量的各個成員。 
其訪問的一般形式爲:
 (*結構指針變量).成員名 或爲: 結構指針變量->;成員名  
例如: (*pstu).num或者: pstu->;num 
應該注意(*pstu)兩側的括號不可少, 因爲成員符“.”的優先級高於“*”。如去掉括號寫作*pstu.num則等效於*(pstu.num),這樣,意義就完全不對了。 下面通過例子來說明結構指針變量的具體說明和使用方法。 
示例6.1
struct stu
{
   int num;
   char *name;
   char sex;
   float score;
} boy1={102,"Zhang ping",'M',78.5},*pstu;
main()
{
   pstu=&boy1;
   printf("Number=%d\nName=%s\n",boy1.num,boy1.name);
   printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);
   printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);
   printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);
   printf("Number=%d\nName=%s\n",pstu->;num,pstu->;name);
   printf("Sex=%c\nScore=%f\n\n",pstu->;sex,pstu->;score);
}
   本例程序定義了一個結構stu,定義了stu類型結構變量boy1 並作了初始化賦值,還定義了一個指向stu類型結構的指針變量pstu。在main函數中,pstu被賦予boy1的地址,因此pstu指向boy1 。然後在printf語句內用三種形式輸出boy1的各個成員值。 從運行結果可以看出:  
結構變量.成員名 
(*結構指針變量).成員名 
結構指針變量->;成員名  
  這三種用於表示結構成員的形式是完全等效的。
七、結構體數組指針變量

結構指針變量可以指向一個結構體數組, 這時結構體指針變量的值是整個結構體數組的首地址。  因爲結構指針變量也表示指向結構體數組的一個元素,所以這時該結構指針變量的值其實是該結構體數組0號元素的首地址。設ps爲指向結構數組的指針變量,則ps也指向該結構數組的0 號元素,ps+1指向1號元素,ps+i則指向i號元素。 這與普通數組的情況是一致的。 
示例7.1
用指針變量輸出結構數組。 
struct stu
{
   int num;
   char *name;
   char sex;
   float score;
}boy[5]={
   {101,"Zhou ping",'M',45},
   {102,"Zhang ping",'M',62.5},
   {103,"Liou fang",'F',92.5},
   {104,"Cheng ling",'F',87},
   {105,"Wang ming",'M',58},
};
main()
{
   struct stu *ps;
   printf("No\tName\t\t\tSex\tScore\t\n");
   for(ps=boy;ps<boy+5;ps++)
   printf("%d\t%s\t\t%c\t%f\t\n",ps->;num,ps->;name,ps->;sex,ps->;score);

}
   在程序中,定義了stu結構類型的外部數組boy 並作了初始化賦值。在main函數內定義ps爲指向stu類型的指針。在循環語句for的表達式1中,ps被賦予boy的首地址,然後循環5次,輸出 boy數組中各成員值。 
   應該注意的是, 一個結構指針變量雖然可以用來訪問結構體變量結構體數組的元素,但是,不能使它指向結構體的一個成員。 也就是說不允許取一個成員的地址來賦予它。
因此,下面的賦值是錯誤的。 ps=&boy[1].sex;而只能是:ps=boy;(賦予數組首地址) 或者是: ps=&boy[0];(賦予0號元素首地址) 
八、結構體變量作爲函數參數使用
在函數的參數中使用結構體和一般的變量沒有本質的區別,其不同僅僅是在定義上.。
比如:
int ptinrect(struct point p, struct rect r)
{
    return p.x >= r.pt1.x && p.x < r.pt2.x && p.y >= r.pt1.y && p.y < r.pt2.y;
}
九、結構體指針變量作函數參數 
   在ANSI C標準中允許用結構變量作函數參數進行整體傳送。 但是這種傳送要將全部成員逐個傳送, 特別是成員爲數組時將會使傳送的時間和空間開銷很大,嚴重地降低了程序的效率。 因此最好的辦法就是使用指針,即用指針變量作函數參數進行傳送。 這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷。 
示例8.1
計算一組學生的平均成績和不及格人數。 
struct stu
{
   int num;
   char *name;
   char sex;
   float score;
}boy[5]={
   {101,"Li ping",'M',45},
   {102,"Zhang ping",'M',62.5},
   {103,"He fang",'F',92.5},
   {104,"Cheng ling",'F',87},
   {105,"Wang ming",'M',58},
};
main()
{
   struct stu *ps;
   void ave(struct stu *ps);
   ps=boy;
   ave(ps);
}
void ave(struct stu *ps)
{
   int c=0,i;
   float ave,s=0;
   for(i=0;i<5;i++,ps++)
   {
      s+=ps->;score;
      if(ps->;score<60) c+=1;
   }
   printf("s=%f\n",s);
   ave=s/5;
   printf("average=%f\ncount=%d\n",ave,c);
}
   本 程序中定義了函數ave,其形參爲結構指針變量ps。boy 被定義爲外部結構數組,因此在整個源程序中有效。在main 函數中定義說明了結構指針變量ps,並把boy的首地址賦予它,使ps指向boy 數組。然後以ps作實參調用函數ave。在函數ave 中完成計算平均成績和統計不及格人數的工作並輸出結果。由於本程序全部採用指針變量作運算和處理,故速度更快,程序效率更高。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章