網(wǎng)站首頁 編程語言 正文
前言
本文開始學(xué)習(xí)結(jié)構(gòu)體的知識點(diǎn),主要內(nèi)容包括:
- 結(jié)構(gòu)體類型的聲明
- 結(jié)構(gòu)體初始化
- 結(jié)構(gòu)體成員訪問
- 結(jié)構(gòu)體傳參
1、結(jié)構(gòu)體的聲明
1.1 結(jié)構(gòu)的基礎(chǔ)知識
結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個成員可以是不同類型的變量
1.2 結(jié)構(gòu)的聲明
struct tag
{
member-list;
}variable-list;
下面幾種方式都一樣,定義了學(xué)生的結(jié)構(gòu)體類型,內(nèi)容包括:名字、年齡、性別、學(xué)號
//舉例1
struct Stu
{
char name[20];//名字
int age;//年齡
char sex[5];//性別
char id[20];//學(xué)號
};//分號不能丟
//舉例2
struct Stu
{
char name[20];//名字
int age;//年齡
char sex[5];//性別
char id[20];//學(xué)號
}s1,s2,s3;//定義了3個結(jié)構(gòu)體類型的變量
//舉例3
typedef struct stu stu;
//舉例4
typedef struct stu
{
char name[20];
int age;
char sex[8];
float score;
}stu;
int main()
{
struct stu stu4;//局部變量
struct stu stu5;
stu stu6;//全局變量
return 0;
}
1.3 結(jié)構(gòu)成員的類型
結(jié)構(gòu)的成員可以是標(biāo)量、數(shù)組、指針,甚至是其他結(jié)構(gòu)體
1.4 結(jié)構(gòu)體變量的定義和初始化
struct Point
{
int x;
int y;
}p1; //聲明類型的同時定義變量p1
struct Point p2; //定義結(jié)構(gòu)體變量p2
//初始化:定義變量的同時賦初值。
struct Point p3 = { x, y };
struct Stu //類型聲明
{
char name[15];//名字
int age; //年齡
};
struct Stu s = { "zhangsan", 20 };//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = { 10, {4,5}, NULL }; //結(jié)構(gòu)體嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//結(jié)構(gòu)體嵌套初始化
2、結(jié)構(gòu)體成員的訪問
2.1 點(diǎn)操作符訪問
結(jié)構(gòu)變量的成員是通過點(diǎn)操作符(.)訪問的。點(diǎn)操作符接受兩個操作數(shù):變量名.成員
struct S s;
strcpy(s.name, "zhangsan");//使用.訪問name成員
s.age = 20;//使用.訪問age成員
2.2 ->操作符訪問
指向一個結(jié)構(gòu)體的指針,結(jié)構(gòu)體指針訪問指向變量的成員,變量名 ->成員
struct Stu
{
char name[20];
int age;
};
void print(struct Stu* ps)
{
printf("name = %s age = %d\n", (*ps).name, (*ps).age);
//使用結(jié)構(gòu)體指針訪問指向?qū)ο蟮某蓡T
printf("name = %s age = %d\n", ps->name, ps->age);
}
3、結(jié)構(gòu)體傳參
3.1 參數(shù)是結(jié)構(gòu)體類型的變量
struct point
{
int x;
int y;
}p1 = {10,20};
struct s//結(jié)構(gòu)體
{
char c;
struct point sp;
double d;
char arr[20];//字符串
};
void print1(struct s ss)//傳參結(jié)構(gòu)體
{
printf("%c\n", ss.c);
printf("%d\n", ss.sp.x);
printf("%d\n", ss.sp.y);
printf("%lf\n", ss.d);
printf("%s\n", ss.arr);
}
int main()
{
struct point p1 = { 100, 200 };//定義1個變量,并初始化
struct s ss = { 'w',{100,20},5.5,"hello" };//初始化
ss.c = 'b';
ss.sp.x = 1000;
ss.sp.y = 2000;
ss.d = 3.14;
//ss.arr = "wolrd";錯誤的方法
strcpy(ss.arr, "world");//字符串賦值函數(shù)
print1(ss);//打印結(jié)構(gòu)體變量
}
3.2 參數(shù)是結(jié)構(gòu)體類型的變量的地址
struct point
{
int x;
int y;
}p1 = {10,20};
struct s
{
char c;
struct point sp;
double d;
char arr[20];//字符串
};
void print2(struct s* ss)//傳參地址
{
printf("%c\n", ss->c);
printf("%d\n", ss->sp.x);
printf("%d\n", ss->sp.y);
printf("%lf\n", ss->d);
printf("%s\n", ss->arr);
}
int main()
{
struct s ss = { 'w',{100,20},5.5,"hello" };//初始化
ss.c = 'b';
ss.sp.x = 1000;
ss.sp.y = 2000;
ss.d = 3.14;
//ss.arr = "wolrd";錯誤的方法
strcpy(ss.arr, "world");
print2(&ss);//打印結(jié)構(gòu)體變量
}
3.3 結(jié)構(gòu)體傳參對比
上面兩種函數(shù)實現(xiàn)的效果一樣,見下圖:
函數(shù)print1接受的是結(jié)構(gòu)體類型變量,是形參,另外開辟了空間,將實參拷貝了一份,占用內(nèi)存空間大
- 函數(shù)print2接受的是結(jié)構(gòu)體類型的地址,定義結(jié)構(gòu)體類型的指針接收地址,只開辟了空間存放地址,占用內(nèi)存空間小
**要注意:**函數(shù)傳參的時候,參數(shù)是需要壓棧的。如果傳遞一個結(jié)構(gòu)體對象的時候,結(jié)構(gòu)體過大,參數(shù)壓棧的的系統(tǒng)開銷比較大,所以會導(dǎo)致性能的下降。因此,結(jié)構(gòu)體傳參的時候,要傳結(jié)構(gòu)體的地址,即函數(shù) print2 比函數(shù) print1 效果好。
總結(jié)
結(jié)構(gòu)體內(nèi)容較少,要牢記定義形式,和傳地址的用法。
下一篇將學(xué)習(xí)一些VS的調(diào)試技巧,編程出現(xiàn)bug,通過調(diào)試能發(fā)現(xiàn)問題,并改進(jìn)程序,這一步非常重要。在學(xué)語言的同時,適當(dāng)?shù)膶W(xué)習(xí)工具的使用,能夠達(dá)到事半功倍的效果。
原文鏈接:https://blog.csdn.net/taibudong1991/article/details/123968636
相關(guān)推薦
- 2022-08-23 Python腳本提取fasta文件單序列信息實現(xiàn)_python
- 2022-07-27 SQL解決未能刪除約束問題drop?constraint_MsSql
- 2022-07-27 Golang的strings.Split()踩坑記錄_Golang
- 2022-07-10 css選擇器優(yōu)先級問題
- 2022-01-31 為什么要使用3×3卷積?& 1*1卷積的作用是什么?& 對ResNet結(jié)構(gòu)的一些理解
- 2022-09-17 Makefile構(gòu)建Golang項目示例詳解_Golang
- 2022-11-19 Golang切片Slice功能操作詳情_Golang
- 2023-01-07 Python個人博客程序開發(fā)實例信息顯示_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支