日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五大板块(3)—— 结构体

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五大板块(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)—— 结构体的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。