C說話 構造體和指針詳解及簡略示例。本站提示廣大學習愛好者:(C說話 構造體和指針詳解及簡略示例)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話 構造體和指針詳解及簡略示例正文
指針也能夠指向一個構造體,界說的情勢普通為:
struct 構造體名 *變量名;
上面是一個界說構造體指針的實例:
struct stu{ char *name; //姓名 int num; //學號 int age; //年紀 char group; //地點小組 float score; //成就 } stu1 = { "Tom", 12, 18, 'A', 136.5 }; //構造體指針
struct stu *pstu = &stu1;
也能夠在界說構造體的同時界說構造體指針:
struct stu{ char *name; //姓名 int num; //學號 int age; //年紀 char group; //地點小組 float score; //成就 } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
留意,構造體變量名和數組名分歧,數組名在表達式中會被轉換為數組指針,而構造體變量名不會,不管在任何表達式中它表現的都是全部聚集自己,要想獲得構造體變量的地址,必需在後面加&,所以給 pstu 賦值只能寫作:
struct stu *pstu = &stu1;
而不克不及寫作:
struct stu *pstu = stu1;
還應當留意,構造體和構造體變量是兩個分歧的概念:構造體是一種數據類型,是一種創立變量的模板,編譯器不會為它分派內存空間,就像 int、float、char 這些症結字自己不占用內存一樣;構造體變量才包括實其實在的數據,才須要內存來存儲。上面的寫法是毛病的,弗成能去取一個構造體名的地址,也不克不及將它賦值給其他變量:
struct stu *pstu = &stu;
struct stu *pstu = stu;
獲得構造體成員
經由過程構造體指針可以獲得構造體成員,普通情勢為:
(*pointer).memberName
或許:
pointer->memberName
第一種寫法中,.的優先級高於*,(*pointer)雙方的括號不克不及少。假如去失落括號寫作*pointer.memberName,那末就等效於*(pointer.numberName),如許意義就完整纰謬了。
第二種寫法中,->是一個新的運算符,習氣稱它為“箭頭”,有了它,可以經由過程構造體指針直接獲得構造體成員;這也是->在C說話中的獨一用處。
下面的兩種寫法是等效的,我們平日采取前面的寫法,如許加倍直不雅。
【示例】構造體指針的應用。
#include <stdio.h> int main(){ struct{ char *name; //姓名 int num; //學號 int age; //年紀 char group; //地點小組 float score; //成就 } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1; //讀取構造體成員的值
printf("%s的學號是%d,年紀是%d,在%c組,本年的成就是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的學號是%d,年紀是%d,在%c組,本年的成就是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
return 0;
}
運轉成果:
Tom的學號是12,年紀是18,在A組,本年的成就是136.5!
Tom的學號是12,年紀是18,在A組,本年的成就是136.5!
【示例】構造體數組指針的應用。
#include <stdio.h> struct stu{ char *name; //姓名 int num; //學號 int age; //年紀 char group; //地點小組 float score; //成就 }stus[] = { {"Zhou ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"Liu fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }, *ps; int main(){ //求數組長度 int len = sizeof(stus) / sizeof(struct stu); printf("Name\t\tNum\tAge\tGroup\tScore\t\n"); for(ps=stus; ps<stus+len; ps++){ printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score); } return 0; }
運轉成果:
Name Num Age Group Score
Zhou ping 5 18 C 145.0
Zhang ping 4 19 A 130.5
Liu fang 1 18 A 148.5
Cheng ling 2 17 F 139.0
Wang ming 3 17 B 144.5
構造體指針作為函數參數
構造體變量名代表的是全部聚集自己,作為函數參數時傳遞的全部聚集,也就是一切成員,而不是像數組一樣被編譯器轉換成一個指針。假如構造體成員較多,特別是成員為數組時,傳送的時光和空間開支會很年夜,影響法式的運轉效力。所以最好的方法就是應用構造體指針,這時候由實參傳向形參的只是一個地址,異常疾速。
【示例】盤算全班先生的總成就、均勻成就和和 140 分以下的人數。
#include <stdio.h> struct stu{ char *name; //姓名 int num; //學號 int age; //年紀 char group; //地點小組 float score; //成就 }stus[] = { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }; void average(struct stu *ps, int len); int main(){ int len = sizeof(stus) / sizeof(struct stu); average(stus, len); return 0; } void average(struct stu *ps, int len){ int i, num_140 = 0; float average, sum = 0; for(i=0; i<len; i++){ sum += (ps + i) -> score; if((ps + i)->score < 140) num_140++; } printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140); }
運轉成果:
sum=707.50
average=141.50
num_140=2
以上就是對構造體和指針的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!