C語言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例
指針也可以指向一個(gè)結(jié)構(gòu)體,定義的形式一般為:
struct 結(jié)構(gòu)體名 *變量名;
下面是一個(gè)定義結(jié)構(gòu)體指針的實(shí)例:
struct stu{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
//結(jié)構(gòu)體指針
struct stu *pstu = &stu1;
也可以在定義結(jié)構(gòu)體的同時(shí)定義結(jié)構(gòu)體指針:
struct stu{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
注意,結(jié)構(gòu)體變量名和數(shù)組名不同,數(shù)組名在表達(dá)式中會(huì)被轉(zhuǎn)換為數(shù)組指針,而結(jié)構(gòu)體變量名不會(huì),無論在任何表達(dá)式中它表示的都是整個(gè)集合本身,要想取得結(jié)構(gòu)體變量的地址,必須在前面加&,所以給 pstu 賦值只能寫作:
struct stu *pstu = &stu1;
而不能寫作:
struct stu *pstu = stu1;
還應(yīng)該注意,結(jié)構(gòu)體和結(jié)構(gòu)體變量是兩個(gè)不同的概念:結(jié)構(gòu)體是一種數(shù)據(jù)類型,是一種創(chuàng)建變量的模板,編譯器不會(huì)為它分配內(nèi)存空間,就像 int、float、char 這些關(guān)鍵字本身不占用內(nèi)存一樣;結(jié)構(gòu)體變量才包含實(shí)實(shí)在在的數(shù)據(jù),才需要內(nèi)存來存儲(chǔ)。下面的寫法是錯(cuò)誤的,不可能去取一個(gè)結(jié)構(gòu)體名的地址,也不能將它賦值給其他變量:
struct stu *pstu = &stu;
struct stu *pstu = stu;
獲取結(jié)構(gòu)體成員
通過結(jié)構(gòu)體指針可以獲取結(jié)構(gòu)體成員,一般形式為:
(*pointer).memberName
或者:
pointer->memberName
第一種寫法中,.的優(yōu)先級(jí)高于*,(*pointer)兩邊的括號(hào)不能少。如果去掉括號(hào)寫作*pointer.memberName,那么就等效于*(pointer.numberName),這樣意義就完全不對(duì)了。
第二種寫法中,->是一個(gè)新的運(yùn)算符,習(xí)慣稱它為“箭頭”,有了它,可以通過結(jié)構(gòu)體指針直接取得結(jié)構(gòu)體成員;這也是->在C語言中的唯一用途。
上面的兩種寫法是等效的,我們通常采用后面的寫法,這樣更加直觀。
【示例】結(jié)構(gòu)體指針的使用。
#include <stdio.h>
int main(){
struct{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
//讀取結(jié)構(gòu)體成員的值
printf("%s的學(xué)號(hào)是%d,年齡是%d,在%c組,今年的成績(jī)是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的學(xué)號(hào)是%d,年齡是%d,在%c組,今年的成績(jī)是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
return 0;
}
運(yùn)行結(jié)果:
Tom的學(xué)號(hào)是12,年齡是18,在A組,今年的成績(jī)是136.5!
Tom的學(xué)號(hào)是12,年齡是18,在A組,今年的成績(jī)是136.5!
【示例】結(jié)構(gòu)體數(shù)組指針的使用。
#include <stdio.h>
struct stu{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
}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ù)組長(zhǎng)度
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;
}
運(yùn)行結(jié)果:
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
結(jié)構(gòu)體指針作為函數(shù)參數(shù)
結(jié)構(gòu)體變量名代表的是整個(gè)集合本身,作為函數(shù)參數(shù)時(shí)傳遞的整個(gè)集合,也就是所有成員,而不是像數(shù)組一樣被編譯器轉(zhuǎn)換成一個(gè)指針。如果結(jié)構(gòu)體成員較多,尤其是成員為數(shù)組時(shí),傳送的時(shí)間和空間開銷會(huì)很大,影響程序的運(yùn)行效率。所以最好的辦法就是使用結(jié)構(gòu)體指針,這時(shí)由實(shí)參傳向形參的只是一個(gè)地址,非??焖佟?/p>
【示例】計(jì)算全班學(xué)生的總成績(jī)、平均成績(jī)和以及 140 分以下的人數(shù)。
#include <stdio.h>
struct stu{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
}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);
}
運(yùn)行結(jié)果:
sum=707.50
average=141.50
num_140=2
以上就是對(duì)結(jié)構(gòu)體和指針的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
相關(guān)文章
c++ vector對(duì)象相關(guān)總結(jié)
這篇文章主要介紹了c++ vector對(duì)象的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-02-02
C++獲取類的成員函數(shù)的函數(shù)指針詳解及實(shí)例代碼
這篇文章主要介紹了C++獲取類的成員函數(shù)的函數(shù)指針詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
C++定時(shí)器實(shí)現(xiàn)和時(shí)間輪介紹
這篇文章主要介紹了C++定時(shí)器實(shí)現(xiàn)和時(shí)間輪介紹,定時(shí)器可以由很多種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),比如最小堆、紅黑樹、跳表、甚至數(shù)組都可以,其本質(zhì)都是拿到最小時(shí)間的任務(wù),然后取出該任務(wù)并執(zhí)行,更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下2022-09-09

