網(wǎng)站首頁 編程語言 正文
一、什么是結(jié)構(gòu)體
在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型;例如在學(xué)生信息登記表中,姓名為字符型,學(xué)號為整型或字符型,年齡為整型,性別為字符型,成績?yōu)檎突驅(qū)嵭汀R驗閿?shù)據(jù)類型不同,顯然不能用一個數(shù)組來存放。
在C語言中,可以使用結(jié)構(gòu)體(Struct)來存放一組不同類型的數(shù)據(jù)。結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語言中聚合數(shù)據(jù)類型(aggregate datatype)的一類。結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時也是一些元素的集合,這些元素稱為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
定義結(jié)構(gòu)體的一般形式為:
struct 結(jié)構(gòu)體名{ ?
? ? 成員列表 ?
};?
在成員表列中可以是幾種基本數(shù)據(jù)類型,也可以是結(jié)構(gòu)體類型。
struct 類型名{} 變量;后的分號不能漏
例如用結(jié)構(gòu)體來表示學(xué)生信息:
struct stu{
char *name; //姓名
int num; //學(xué)號
char sex; //性別
float score; //成績
};
二、結(jié)構(gòu)體變量
結(jié)構(gòu)體也是一種數(shù)據(jù)類型,可以用來說明變量。例如:
struct stu stu1, stu2;
定義了兩個變量 stu1 和 stu2,它們都是 stu 類型,都由 4 個成員組成。注意關(guān)鍵字struct不能少。
結(jié)構(gòu)體的各個成員在內(nèi)存中是連續(xù)存儲的。stu1、stu2 的內(nèi)存如下圖所示:
也可以在定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量:
struct stu{
char *name; //姓名
int num; //學(xué)號
char sex; //性別
float score; //成績
} stu1, stu2;
如果只需要 stu1、stu2 兩個變量,也可以不寫結(jié)構(gòu)體名字:
struct{ //沒有寫 stu
char *name; //姓名
int num; //學(xué)號
char sex; //性別
float score; //成績
} stu1, stu2;
這樣做書寫簡單,但是因為沒有結(jié)構(gòu)體名,后面就沒法用該結(jié)構(gòu)體定義新的變量。
也可以用宏定義使一個符號常量來表示一個結(jié)構(gòu)類型,例如:
#define STU struct stu
STU{
char *name; //姓名
int num; //學(xué)號
char sex; //性別
float score; //成績
};
STU stu1, stu2;
后面我們會學(xué)習(xí)Windows編程,大部分結(jié)構(gòu)體都是這樣定義的。
typedef和#define用法不同,甚至可以結(jié)合起來靈活使用,使用時一定要注意兩者的不同之處。
三、成員的獲取和賦值
在C語言中,使用點號.來獲取結(jié)構(gòu)體中的一個成員,一般格式為:
結(jié)構(gòu)變量名.成員名 ?
例如:
stu1.name; //第一個學(xué)生的姓名
stu2.score; //第二個學(xué)生的成績
獲取成員后,就可以對該成員進行賦值了,例如:
stu1.name = “Tom”;
stu2.score = 90.5;
除了可以對成員進行逐一賦值,也可以像數(shù)組一樣整體賦值,例如:
struct stu{
char *name; //姓名
int num; //學(xué)號
char sex; //性別
float score; //成績
} stu1, stu2 = { "Tom", 10, 'M', 90 };
不過整體賦值僅限于上面這樣的情況,也就是定義結(jié)構(gòu)體的同時聲明變量。下面的寫法是錯誤的:
stu2 = { "Tom", 10, 'M', 90 };
一個完整的示例:
#include <stdio.h>
#define STU struct stu
int main(){
STU{
char *name; //姓名
int num; //學(xué)號
char sex; //性別
float score; //成績
};
STU stu1;
stu1.name = "James Bond";
stu1.num = 1;
stu1.sex = 'M'; //用M表示男性,W表示女性
stu1.score = 99;
printf("Hello everyone! My name is %s, a naughty boy, but with good scores(%.2f) and top No.(%d)!", stu1.name, stu1.score, stu1.num);
return 0;
}
附:結(jié)構(gòu)體數(shù)組
指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組中的元素。
struct Student
{
int num;
char name[20];
char sex;
} s1[3];
struct Student *p;
指針可以指向數(shù)組,代碼如下:p = s1; p = &s1[0]; 指針移動p++ 移動一個結(jié)構(gòu)體字節(jié)大小;
指針訪問成員方式:(*p).num ? p->num。
總結(jié)
原文鏈接:https://blog.csdn.net/qq_32832803/article/details/110926157
相關(guān)推薦
- 2022-06-17 GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法實例詳解_Golang
- 2023-07-30 element中對el-input 自定義驗證規(guī)則
- 2023-07-05 uni-app滾動分頁 兼容(App 小程序 H5)
- 2022-11-01 PyTorch實現(xiàn)MNIST數(shù)據(jù)集手寫數(shù)字識別詳情_python
- 2022-04-12 python入門之Scrapy?shell的使用_python
- 2022-11-09 Python運算符教程之邏輯門詳解_python
- 2022-04-16 Python數(shù)據(jù)結(jié)構(gòu)與算法之跳表詳解_python
- 2022-10-03 Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- 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被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支