程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言結構體

C語言結構體

編輯:關於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

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;inext=p1;pass=p1;}    //用pass暫存當前地址,作為中間量傳遞

  printf("input name:\n");

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

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

}

return  head;      //返回鏈表頭結點
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved