国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言 結構體和指針詳解及簡單示例

2020-01-26 14:27:22
字體:
來源:轉載
供稿:網(wǎng)友

指針也可以指向一個結構體,定義的形式一般為:

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;

注意,結構體變量名和數(shù)組名不同,數(shù)組名在表達式中會被轉換為數(shù)組指針,而結構體變量名不會,無論在任何表達式中它表示的都是整個集合本身,要想取得結構體變量的地址,必須在前面加&,所以給 pstu 賦值只能寫作:

struct stu *pstu = &stu1;

而不能寫作:

struct stu *pstu = stu1;

還應該注意,結構體和結構體變量是兩個不同的概念:結構體是一種數(shù)據(jù)類型,是一種創(chuàng)建變量的模板,編譯器不會為它分配內(nèi)存空間,就像 int、float、char 這些關鍵字本身不占用內(nèi)存一樣;結構體變量才包含實實在在的數(shù)據(jù),才需要內(nèi)存來存儲。下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變量:

struct stu *pstu = &stu;
struct stu *pstu = stu;

獲取結構體成員

通過結構體指針可以獲取結構體成員,一般形式為:

(*pointer).memberName

或者:

pointer->memberName

第一種寫法中,.的優(yōu)先級高于*,(*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!

【示例】結構體數(shù)組指針的使用。

#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(){ //求數(shù)組長度 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

結構體指針作為函數(shù)參數(shù)

結構體變量名代表的是整個集合本身,作為函數(shù)參數(shù)時傳遞的整個集合,也就是所有成員,而不是像數(shù)組一樣被編譯器轉換成一個指針。如果結構體成員較多,尤其是成員為數(shù)組時,傳送的時間和空間開銷會很大,影響程序的運行效率。所以最好的辦法就是使用結構體指針,這時由實參傳向形參的只是一個地址,非常快速。

【示例】計算全班學生的總成績、平均成績和以及 140 分以下的人數(shù)。

#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

以上就是對結構體和指針的資料整理,后續(xù)繼續(xù)補充相關資料,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 西宁市| 昌乐县| 桐柏县| 贺兰县| 呈贡县| 施甸县| 北流市| 常山县| 安丘市| 文登市| 封丘县| 吉林省| 寿阳县| 类乌齐县| 酒泉市| 白朗县| 闽清县| 广元市| 安龙县| 西和县| 鄯善县| 舟山市| 青田县| 台州市| 太谷县| 新营市| 衡水市| 涞水县| 根河市| 伊通| 宜春市| 永安市| 若尔盖县| 西乡县| 德化县| 龙山县| 甘洛县| 屏东市| 崇州市| 都昌县| 项城市|