譚浩強C-結構體


一、結構體的定義

1、定義形式

struct 結構名

{成員列表;};       //定義為語句,分號不能丟

2、結構類型變量的聲明

(1)聲明形式1

struct student

{ int number;

   char name[10];

   float score;

};

struct student st1,st2,st3;

(2)聲明形式2

struct student

{ int number;

   char name[10];

   float score;

}st1,st2,st3;

(3)結構體變量的賦值

如上例:

struct student

{ int number;

   char name[10];

   float score;

}st1={101,"wang",87.5};

3、結構數組的定義

struct student

{ int number;

   char name[10];

   float score;

}stu[50]={

   {101,"wang",87.5},

   {102,"li",90},

   ...

    };   //定義並初始化50個數組元素,每個元素均具有結構體student的結構。

二、結構指針

1、聲明形式

struct 結構名 *指針變量名      //方法一:須在聲明結構指針變量前應已說明該結構體

struct 結構名

{結構體

}*指針變量名;    //方法二:與結構體變量一樣

2、結構指針的賦值

struct student{

...

};

struct student *p;

struct student st1={..};

p=&st1;  //取該結構體變量的首地址

3、通過結構指針變量訪問結構變量成員

若st1為上述student結構體變量,p為該結構體指針變量:

使p=&st1;則可用下列方法訪問st1各成員:

p->num、p->name、p->score。

或(*p).num、(*p).name ...

與st1直接引用:st1.num都可以用來表示st1的成員。

4、指向結構數組的指針

struct student

{ int num;

  char name[10];

}stu[10]={...};                //聲明並初始化結構數組stu

struct student *p;            //聲明結構指針p

p=stu;        //對p賦值,指向數組stu首地址

for(;p<stu+10;p++)           //stu+10表示第10個數組元素的首地址,p++表示指向下一個  數組元素

 printf("%d,%s",p->num,p->name[10]);  //通過指針變量引用結構數組元素的成員

三、動態存儲分配

1、malloc函數

在內存動態存儲區里分配一塊長度為N字節的連續區域,返回值為該內存區首地址,類型說明符表示該內存區存貯的數據類型,(類型說明符*)表示將該返回值指針強制轉換成該類型指針:

(類型說明符*)malloc(N)

如:

(int*)malloc(100);   

(struct student*)malloc(sizeof(struct student));

2、calloc函數

(類型說明符*)calloc(n,N) //動態存儲區內分配n個長度為N字節的連續區域,返回值為該區首地址,(類型說明符*)表示將該返回值指針強制轉換成該類型指針;

3、free函數

free(void*ptr);  //釋放指針變量ptr指向的一塊內存空間,使用free函數前:ptr指向的必須是事先通過malloc或calloc分配的區域。

四、鏈表

如何分配空間來存儲學生的數據?可想到使用結構體數組,但如何確定學生的數量?新增或刪減學生如何處理?引申出鏈表描述:

鏈表各元素首先均是一個結構體,各個元素稱為結點,各結點對應結構體內有一成員為指針變量,指向該結點下一個結點的首地址,第0個結點稱為頭結點,僅存有指針變量,指向第1個結點;最后一個結點的指針變量成員指向為空(NULL)。

例:建立一個學生數據的鏈表結構

struct student{

char *name;

struct student *pnext;  //指向下一個結點的指針變量,下一結點數據類型為結構體

};        //完成鏈表結構聲明

int i;

struct student *head,*p1,*pass;

for(i=0;i<N;i++)

{

  p1=(struct student*)malloc(sizeof(struct student));//分配一塊結點空間

  if(i==0)  {head=p1;pass=p1;}        //頭結點初始化

  else  {pass->next=p1;pass=p1;}    //用pass暫存當前地址,作為中間量傳遞

  printf("input name:\n");

  scanf("%s",p1->name);           //鏈接結點內容輸入

  p1->next=Null;           //每次循環當前分配區為最后一個結點,使其指針指向空

}

return  head;      //返回鏈表頭結點

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM