五大板块(3)—— 结构体
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                五大板块(3)—— 结构体
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                參考:五大板塊(3)—— 結構體
 作者:丶PURSUING
 發布時間: 2021-03-18 16:02:43
 網址:https://blog.csdn.net/weixin_44742824/article/details/114981743
目錄
- 結構體的三種定義賦值方法
- 結構體數組
- 結構體指針(在指針中已有介紹)
- 結構體的綜合運用👉學生成績處理
- 小問題:不會釋放指針,或者需不需要釋放?
 
- 結構體大小計算方法
結構體的三種定義賦值方法
#include <stdio.h> #include <string.h>struct student {int englishScore;int mathScore;int chineseScore;char name[128];};//此處分號易漏int main() {//一、在結構體變量定義的時候就賦值,此時要全部賦值struct student stu1={100,100,100,"周星星"};//二、先定義,后賦值,不需要全部賦值struct student stu2;stu2.englishScore = 90;//stu2.name = "張大大"; //結構體(類)中:JAVA c++可以這么賦值 C語言不可以!strcpy(stu2.name,"張大大");//C語言中字符串必須通過strcpy進行賦值//char *str="我愛你"; 初始化可以直接用指針變量指向該字符串//chat *str; 指針和值分開要用到strcpy進行賦值//str = (char*)malloc(128);//memset(str,'\0',128);//strcpy(str,"我愛你"); //三、常用的部分賦值方式,多見于內核源碼對結構體的定義struct student stu3={.name = "華天朱",.englishScore = 90,.mathScore = 80, //此處是逗號};//分號易漏printf("stu1的名字是:%s,分數:%d\n",stu1.name,stu1.englishScore);printf("stu2的名字是:%s,分數:%d\n",stu2.name,stu2.englishScore);printf("stu3的名字是:%s,分數:%d\n",stu3.name,stu3.englishScore);return 0; }運行結果:
stu1的名字是:周星星,分數:100 stu2的名字是:張大大,分數:90 stu3的名字是:華天朱,分數:90- 1
- 2
- 3
為什么使用strcpy?
 如果不在結構體變量初始化的時候就對具有數組類型的表達式賦值,則要使用strcpy,即不能直接賦值。
線下班常犯下的致命問題
struct data1{ char*p; };struct data2{ char p[128]; }; 兩者區別在于前者為野指針,不清楚指向什么地址,訪問時(使用strcpy())會報錯 必須要先經過malloc和memset這兩步操作結構體數組
做個簡單應用就好:輸入4個學生的名字成績,找出最高分。
#include <stdio.h> #include <string.h> #include <stdlib.h>struct student {char* name; //char name[128];這種方法浪費空間 在linux環境下,一個指針只占用8個字節int score; };int main() {int i;struct student stu[4];for(i=0;i<4;i++){printf("請輸入第%d個學生的名字\n",i+1);stu[i].name = (char* )malloc(sizeof(char)*16);memset(stu[i].name,0,sizeof(char)*16);scanf("%s",stu[i].name);printf("請輸入他的成績\n");scanf("%d",&stu[i].score);}struct student stuMax = stu[0];//就像正常的變量一樣,可以相互賦值for(i=1;i<3;i++){if(stu[i].score > stuMax.score){stuMax = stu[i];}}printf("最高分是%s:%d\n",stuMax.name,stuMax.score);return 0; }結果:
請輸入第1個學生的名字 喜羊羊 請輸入他的成績 90 請輸入第2個學生的名字 懶羊羊 請輸入他的成績 60 請輸入第3個學生的名字 美羊羊 請輸入他的成績 80 請輸入第4個學生的名字 廢羊羊 請輸入他的成績 30 最高分是喜羊羊:90- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
跟結構體指針真的好像。
結構體指針(在指針中已有介紹)
結構體的綜合運用👉學生成績處理
因為呢結構體比較重要,搞個稍微復雜一點的練練手。
主要運用結構體指針,輸入學生的學號,語文數學英語成績。
要求封裝功能函數(初始化學生成績,找到分數最高的學生,算出班級平均分)。
#include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct student {char* name;int chinese;int math;int english;int total; }STU,*PSTU; //typedef 為一種數據類型定義一個新名字PSTU initStu(int num) {int i;//要想返回結構體指針,就要先創建并開創空間。PSTU p = (PSTU)malloc(sizeof(STU) * num);for(i=0;i<num;i++){printf("請輸入第%d個學生的學號\n",i+1);p->name = (char* )malloc(16);//為字符指針開辟空間后才能賦值,否則就等著段錯誤吧。memset(p->name,0,16); //在堆上面開辟空間,函數結束調用不會釋放scanf("%s",p->name);printf("請分別輸入語文,數學,英語成績,以逗號隔開,以回車結束\n");scanf("%d,%d,%d",&p->chinese,&p->math,&p->english);p++;}return p-num; }void print(PSTU stuSum,PSTU stuMax,int ave,int num) {int i;PSTU p = stuSum;//這樣不會導致stuSum指針偏移for(i=0;i<num;i++){printf("%s>>>>語文:%d,數學:%d,英語:%d\n\n",p->name,p->chinese,p->math,p->english);p++;}printf("總分最高分是%s:%d\n",stuMax->name,stuMax->total);printf("班級平均分是:%d\n",ave);// free(p-num); // p = NULL;}PSTU findMax(PSTU stuSum,int num) {int i;PSTU max = stuSum;PSTU p = stuSum;for(i=0;i<num;i++){if(p->total > max->total){max = p;}p++;}return max; }void getTotalAndAve(PSTU stuSum,int num,int* ave) {int i;int sum = 0;PSTU p = stuSum;for(i=0;i<num;i++){p->total = p->chinese + p->math + p->english;p++;}p -= num;for(i=0;i<num;i++){sum += p->total;p++;}*ave = sum / num;// free(p-num); // p=NULL;}int main() {int num;//學生人數int ave;//班級均分printf("需要錄入幾人的成績?\n");scanf("%d",&num);PSTU stuSum = initStu(num);//初始化學生信息getTotalAndAve(stuSum,num,&ave);//計算各個學生的總分以及班級均分PSTU stuMax = findMax(stuSum,num);//找到總分最高的學生print(stuSum,stuMax,ave,num);//打印學生信息,最高分的人,班級均分return 0; }結果:
18001>>>>語文:90,數學:80,英語:70 18002>>>>語文:98,數學:9,英語:76 18003>>>>語文:54,數學:89,英語:90 總分最高分是18001:240 班級平均分是:218- 1
- 2
- 3
- 4
- 5
小問題:不會釋放指針,或者需不需要釋放?
free(p); p = NULL;- 1
- 2
報錯:釋放了一個自由的地址?釋放錯了?
double free or corruption (!prev): 0x0017d848 ***- 1
可能是因為p++的影響,釋放錯了地址,于是
free(p-num); p = NULL;- 1
- 2
嘿嘿,還是不行,懂了再回來更新。我還是先注釋掉吧。
結構體大小計算方法
總結
以上是生活随笔為你收集整理的五大板块(3)—— 结构体的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 21天学通c语言总结(3)
- 下一篇: python中在同一个位置输出数据
