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;
還應該注意,結構體和結構體變量是兩個不同的概念:結構體是一種數據類型,是一種創(chuàng)建變量的模板,編譯器不會為它分配內存空間,就像 int、float、char 這些關鍵字本身不占用內存一樣;結構體變量才包含實實在在的數據,才需要內存來存儲。下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變量:
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!
【示例】結構體數組指針的使用。
#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
以上就是對結構體和指針的資料整理,后續(xù)繼續(xù)補充相關資料,謝謝大家對本站的支持!
您可能感興趣的文章
- 04-02c語言函數調用后清空內存 c語言調用函數刪除字符
- 04-02c語言的正則匹配函數 c語言正則表達式函數庫
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言中對數函數的表達式 c語言中對數怎么表達
- 04-02c語言用函數寫分段 用c語言表示分段函數
- 04-02c語言編寫函數冒泡排序 c語言冒泡排序法函數
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段函數
- 04-02C語言中怎么打出三角函數 c語言中怎么打出三角函數的值
- 04-02c語言調用函數求fibo C語言調用函數求階乘


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-11ajax實現頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10C#中split用法實例總結
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文