當前文章介紹動態(tài)堆空間內(nèi)存分配與釋放,C語言結(jié)構(gòu)體定義、初始化、賦值、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針的相關知識點,最后通過一個學生管理系統(tǒng)綜合練習結(jié)構(gòu)體數(shù)組的使用。
1. 動態(tài)內(nèi)存管理
C語言代碼----->編譯----->鏈接------>可執(zhí)行的二進制文件(windows下xxx.exe)
二進制文件中的數(shù)據(jù)是如何擺放的? 文本數(shù)據(jù)段、靜態(tài)數(shù)據(jù)段、全局數(shù)據(jù)段。
堆??臻g: 代碼在運行的時候才有的空間。
??臻g: 系統(tǒng)負責申請,負責釋放。比如: 函數(shù)形參變量、數(shù)組……
堆空間: 程序員負責申請,負責釋放。
#include //標準庫頭文件 void *malloc(int size); //內(nèi)存申請。 形參表示申請的空間大小,返回值:申請的空間的地址 void free(void *p); //內(nèi)存釋放。 形參就是要釋放的空間首地址。
動態(tài)空間申請示例。
動態(tài)空間申請 #include "stdio.h" #include "string.h" #include int main() { int *p=malloc(sizeof(int)); //申請空間 if(p!=NULL) { printf("申請的空間地址: 0x%X\n",p); *p=888; printf("%d\n",*p); } free(p); //釋放空間 return 0; } 示例2: #include "stdio.h" #include "string.h" #include char *func(void) { char*str=malloc(100); //char str[100]; if(str!=NULL) { strcpy(str,"1234567890"); printf("子函數(shù)打印:%s\n",str); //free(str); //釋放空間 return str; } else { return NULL; } } int main() { char *p=func(); printf("主函數(shù)打印:%s\n",p); return 0; }
2. 結(jié)構(gòu)體
2.1 定義語法
結(jié)構(gòu)體的概念: 可存放不同數(shù)據(jù)類型的集合。
比如: 存放一個班級學生的信息。
可以使用一個結(jié)構(gòu)體存放一個學生的信息。
一個結(jié)構(gòu)體數(shù)組存放整個班級的學習信息。

數(shù)組的概念: 可存放相同數(shù)據(jù)類型的集合。
結(jié)構(gòu)體的定義語法:
//聲明一種新類型-----數(shù)據(jù)類型 struct <結(jié)構(gòu)體的名稱> { <結(jié)構(gòu)體的成員>1; <結(jié)構(gòu)體的成員>2; ………… }; //最后有分號結(jié)束 struct MyStruct { char a; int b; float c; char str[100]; };
2.2 定義示例
結(jié)構(gòu)體如何賦值? 如何訪問結(jié)構(gòu)體內(nèi)部成員
#include "stdio.h" #include "string.h" #include //定義結(jié)構(gòu)體數(shù)據(jù)類型 struct MyStruct { char a; int b; float c; char str[100]; }; int main() { struct MyStruct data={'A',123,456.789,"abcd"}; //data就是結(jié)構(gòu)體類型的變量 //結(jié)構(gòu)體變量訪問內(nèi)部成員的語法: . 點運算符 printf("%c\n",data.a); printf("%d\n",data.b); printf("%f\n",data.c); printf("%s\n",data.str); return 0; }
2.3 初始化
#include "stdio.h" #include "string.h" #include //定義結(jié)構(gòu)體數(shù)據(jù)類型 struct MyStruct { char a; int b; float c; char str[100]; }data={'A',123,456.789,"abcd"}; //data就是結(jié)構(gòu)體類型的變量 int main() { //結(jié)構(gòu)體變量訪問內(nèi)部成員的語法: . 點運算符 printf("%c\n",data.a); printf("%d\n",data.b); printf("%f\n",data.c); printf("%s\n",data.str); return 0; }
2.4 結(jié)構(gòu)體賦值
//結(jié)構(gòu)體變量訪問內(nèi)部成員的語法: . 點運算符 #include "stdio.h" #include "string.h" #include //定義結(jié)構(gòu)體數(shù)據(jù)類型 struct MyStruct { char a; int b; float c; char str[100]; }; int main() { struct MyStruct data;//data就是結(jié)構(gòu)體類型的變量 //成員單獨賦值 data.a='A'; data.b=123; data.c=456.789; strcpy(data.str,"abcd"); //數(shù)組賦值 //結(jié)構(gòu)體變量訪問內(nèi)部成員的語法: . 點運算符 printf("%c\n",data.a); printf("%d\n",data.b); printf("%f\n",data.c); printf("%s\n",data.str); return 0; }
2.5 結(jié)構(gòu)體數(shù)組
結(jié)構(gòu)體賦值分為兩種標準: C89 、C99 ?結(jié)構(gòu)體數(shù)組 #include "stdio.h" #include "string.h" #include //定義結(jié)構(gòu)體數(shù)據(jù)類型 struct MyStruct { char a; int b; float c; char str[100]; }; int main() { struct MyStruct data[100];//data就是結(jié)構(gòu)體數(shù)組類型變量 struct MyStruct data2[50]; //成員單獨賦值 data[0].a='A'; data[0].b=123; data[0].c=456.789; strcpy(data[0].str,"abcd"); //數(shù)組賦值 //結(jié)構(gòu)體變量訪問內(nèi)部成員的語法: . 點運算符 printf("%c\n",data[0].a); printf("%d\n",data[0].b); printf("%f\n",data[0].c); printf("%s\n",data[0].str); return 0; }
2.6 結(jié)構(gòu)體指針賦值
#include "stdio.h" #include "string.h" #include //定義結(jié)構(gòu)體數(shù)據(jù)類型 struct MyStruct { char a; int b; float c; char str[100]; }; int main() { //struct MyStruct buff[100]; //struct MyStruct *data=buff; //結(jié)構(gòu)體指針類型變量 struct MyStruct *data=malloc(sizeof(struct MyStruct)); data->a='A'; data->b=123; data->c=456.789; strcpy(data->str,"abcd"); //結(jié)構(gòu)體指針訪問內(nèi)部成員的變量 通過 -> 運算符。 printf("%c\n",data->a); printf("%d\n",data->b); printf("%f\n",data->c); printf("%s\n",data->str); return 0; }
3. 學生管理系統(tǒng)
作業(yè): 學生管理系統(tǒng)
需求: (每一個功能都是使用函數(shù)進行封裝)
1.實現(xiàn)從鍵盤上錄入學生信息。 (姓名、性別、學號、成績、電話號碼)
2.將結(jié)構(gòu)體里的學生信息全部打印出來。
3.實現(xiàn)根據(jù)學生的姓名或者學號查找學生,查找到之后打印出學生的具體信息。
4.根據(jù)學生的成績對學生信息進行排序。
5.根據(jù)學號刪除學生信息。
示例:
#include "stdio.h" #include "string.h" #include //定義存放學生信息的結(jié)構(gòu)體類型 struct StuDentInfo { char Name[20]; //姓名 int number; //學號 char phone[20];//電話號碼 }; //全局變量區(qū)域 unsigned int StuDentCnt=0; //記錄已經(jīng)錄入的全部學生數(shù)量 //函數(shù)聲明區(qū)域 void PrintStuDentInfoList(void); void InputStuDentInfo(struct StuDentInfo*info); void FindStuDentInfo(struct StuDentInfo*info); void SortStuDentInfo(struct StuDentInfo*info); void PrintStuDentInfo(struct StuDentInfo*info); int main() { struct StuDentInfo data[100]; //可以100位學生的信息 int number; while(1) { PrintStuDentInfoList(); //打印功能列表 scanf("%d",&number); printf("\n"); switch(number) { case 1: InputStuDentInfo(data); break; case 2: FindStuDentInfo(data); break; case 3: SortStuDentInfo(data); break; case 4: PrintStuDentInfo(data); break; case 5: break; default: printf("選擇錯誤!\n\n"); break; } } return 0; } /* 函數(shù)功能: 打印學生管理系統(tǒng)的功能列表 */ void PrintStuDentInfoList(void) { printf("\n--------------學生管理系統(tǒng)功能列表----------------\n"); printf("1. 錄入學生信息\n"); printf("2. 根據(jù)學號查找學生信息\n"); printf("3. 根據(jù)學號排序\n"); printf("4. 打印所有學生信息\n"); printf("5. 刪除指定的學生信息\n"); printf("請選擇功能序號:"); } /* 函數(shù)功能: 錄入學生信息 */ void InputStuDentInfo(struct StuDentInfo*info) { printf("輸入學生姓名:"); scanf("%s",info[StuDentCnt].Name); printf("輸入學號:"); scanf("%d",&info[StuDentCnt].number); printf("輸入電話號碼:"); scanf("%s",info[StuDentCnt].phone); StuDentCnt++; //數(shù)量自增 } /* 函數(shù)功能: 查找學生信息 */ void FindStuDentInfo(struct StuDentInfo*info) { int num,i; printf("輸入查找的學號:"); scanf("%d",&num); for(i=0; iinfo[j+1].number) { tmp=info[j]; info[j]=info[j+1]; info[j+1]=tmp; } } } } /* 函數(shù)功能: 打印所有學生信息 */ void PrintStuDentInfo(struct StuDentInfo*info) { int i=0; printf("-----------所有學生的信息列表------------\n"); for(i=0;iC 語言 數(shù)據(jù)結(jié)構(gòu)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。