程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話 構造體和指針詳解及簡略示例

C說話 構造體和指針詳解及簡略示例

編輯:關於C++

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

以上就是對構造體和指針的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved