C语言中的结构体(struct)详解

C语言中的结构体(struct)详解


结构体是C语言中强大的数据组织工具,它允许将不同类型的变量组合在一起,便于理解、移植,并优化内存访问速度。声明结构体的语法如下:


struct 结构体名称 { 成员列表</};

以学生信息为例,我们可以定义一个名为Student的结构体:


struct Student</ {

char name[20]</;

int num</;

float score</;

};

创建结构体变量时,我们使用struct 结构体名称 结构体变量名;的格式,比如创建一个名为stu1的Student结构体:


struct Student stu1;</

访问结构体成员使用结构成员运算符.,如stu1.name。如果成员是嵌套结构,如stu1.birthday.year,则表示访问嵌套结构的某个属性。


结构体变量的初始化有多种方法:



  • 逐个赋值:struct Student stu1, stu2; 分别初始化为strcpy(stu1.name, "Jack"); stu1.num = 18; stu1.score = 90.5; 注意,不能直接赋值给数组名。

  • 结构体整体赋值:stu2 = (struct Student){ "Tom", 15, 88.0}; 这是通过强制类型转换实现的。

  • 结构体变量同时初始化:struct Student stu = { "Mike", 15, 91}; 当类型和顺序一致时,这种方式更简洁。

  • 部分初始化:stu4 = {.name = "Lisa"}; 可指定部分成员进行初始化。

  • 指定顺序初始化:st = { .name, .score, .num }; 保证了成员的初始化顺序。


结构体的内存分配时,会考虑对齐以提升效率。计算结构体大小时,需考虑成员长度、对齐填充以及结构体对齐模数。例如,如果对齐模数为2,成员会按2的倍数进行对齐。



  1. 对齐:结构体成员在内存中以特定对齐方式存储,提高性能。

  2. 计算过程:总长度 = 所有成员长度之和 + 对齐填充 (满足模数要求)。


当使用#pragma pack指令时,对齐模数可能会发生变化,影响成员的内存布局。结构体数组作为数组元素,如存储多个学生信息,定义和初始化遵循特定格式。


定义和初始化结构体数组示例:


struct Student { ... } studentArray[10];</ // 数组长度为10

可以同时定义和初始化,或者逐个赋值。


结构体与指针紧密相连,对于高效编程至关重要。指针变量定义为struct 结构体名称 * 结构指针变量名;,如struct Student *pstu;。通过&运算符获取结构变量地址,如pstu = &结构变量名;。



  • 结构指针访问成员</: 使用(*结构指针).成员名 或 结构指针 -> 成员名。

  • 嵌套结构指针</: 结构体成员可以包含嵌套的结构体,如struct Birthday ...。

  • 函数参数</: 结构体成员可以作为函数参数,如void printNum(int num); void PrintStu(struct Student student);。


使用指针传递结构体时,应留意成员优先级、嵌套结构的初始化与访问,以及函数参数类型的要求。例如,通过指针操作可以高效地修改结构体,但需注意形参和实参的区别,如下面的代码片段:


```cpp
struct Student student0 = { "Mike", 27, 91};
// 使用指针修改结构体,会直接改变原结构
void PrintStu2(struct Student *student) {
student->num = 100;
printf("PrintStu2 修改后:姓名: %s, 学号: %d, 内存地址: %p
",
student->name, student->num, student);
}
// 通过地址调用,修改不影响原结构
PrintStu2(&student0);
printf("原来:姓名: %s, 学号: %d, 内存地址: %p
",
student0.name, student0.num, &student0);
```
这段代码展示了指针如何影响原结构体,以及何时选择使用指针以避免影响原始数据。通过理解这些概念,您可以更有效地在C语言中使用结构体来组织数据和操作。


  • C璇█涓殑缁撴瀯浣(struct)璇﹁В
    绛旓細C璇█涓殑缁撴瀯浣擄紙struct锛夎瑙g粨鏋勪綋鏄疌璇█涓己澶х殑鏁版嵁缁勭粐宸ュ叿锛屽畠鍏佽灏嗕笉鍚岀被鍨嬬殑鍙橀噺缁勫悎鍦ㄤ竴璧凤紝渚夸簬鐞嗚В銆佺Щ妞嶏紝骞朵紭鍖栧唴瀛樿闂熷害銆傚0鏄庣粨鏋勪綋鐨勮娉曞涓嬶細struct 缁撴瀯浣撳悕绉 { 鎴愬憳鍒楄〃</};浠ュ鐢熶俊鎭负渚嬶紝鎴戜滑鍙互瀹氫箟涓涓悕涓篠tudent鐨勭粨鏋勪綋锛歴truct Student</ { char name[20]</...
  • struct鍦c璇█涓鏄粈涔堟剰鎬?
    绛旓細struct鍦C璇█涓殑鍚箟鏄缁撴瀯浣銆備竴銆佺粨鏋勪綋鐨勬蹇 鍦–璇█涓紝struct鏄竴绉嶅鍚堟暟鎹被鍨嬶紝鐢ㄤ簬缁勫悎澶氫釜涓嶅悓绫诲瀷鐨勬暟鎹」銆傚畠鍏佽绋嬪簭鍛樺垱寤鸿嚜瀹氫箟鐨勬暟鎹粨鏋勶紝杩欎簺缁撴瀯鍙互鍖呭惈澶氫釜涓嶅悓绫诲瀷鐨勫彉閲忥紝濡傛暣鏁般佹诞鐐规暟銆佸瓧绗︾瓑銆傜粨鏋勪綋鎻愪緵浜嗕竴绉嶇粍缁囨暟鎹殑鏂瑰紡锛屼娇寰楁暟鎹洿鍔犳湁搴忓拰鏄撲簬绠$悊銆備簩銆乻truct鐨勫0...
  • struct鏄粈涔堟剰鎬濆湪c璇█绋嬪簭涓?
    绛旓細struct鏄C璇█涓鐢ㄤ簬瀹氫箟缁撴瀯浣鐨勫叧閿瓧銆備互涓嬫槸鍏充簬struct鐨 1. 缁撴瀯浣撳畾涔 鍦–璇█涓紝struct鍏抽敭瀛楃敤浜庡畾涔夋暟鎹粨鏋勶紝杩欑缁撴瀯鍙互鍖呭惈澶氫釜涓嶅悓绫诲瀷鐨勬暟鎹傜粨鏋勪綋鍏佽鎴戜滑鍒涘缓涓涓寘鍚涓笉鍚岀被鍨嬫暟鎹殑鍗曚竴鏁版嵁绫诲瀷銆傞氳繃杩欑鏂瑰紡锛屾垜浠彲浠ョ粍缁囨暟鎹紝浣垮叾鏇寸鍚堢壒瀹氶棶棰樼殑闇姹傘傜粨鏋勪綋鍙互鍖呭惈涓嶅悓绫诲瀷...
  • struct :c璇█涓殑杩欎釜鏄粈涔堟剰鎬濆晩
    绛旓細缁撴瀯浣(struct)鏄敱涓绯诲垪鍏锋湁鐩稿悓绫诲瀷鎴栦笉鍚岀被鍨嬬殑鏁版嵁鏋勬垚鐨勬暟鎹泦鍚堬紝涔熷彨缁撴瀯銆傚湪C璇█涓锛屽彲浠ュ畾涔夌粨鏋勪綋绫诲瀷锛屽皢澶氫釜鐩稿叧鐨勫彉閲忓寘瑁呮垚涓轰竴涓暣浣撲娇鐢ㄣ傚湪闈㈠悜瀵硅薄鐨勭▼搴忚璁′腑锛屽璞″叿鏈夌姸鎬侊紙灞炴э級鍜岃涓猴紝鐘舵佷繚瀛樺湪鎴愬憳鍙橀噺涓紝琛屼负閫氳繃鎴愬憳鏂规硶锛堝嚱鏁帮級鏉ュ疄鐜般傜粨鏋勪綋 struct瀹炵幇鏂规硶涓婂拰鏁扮粍鏄竴...
  • C璇█缁撴瀯浣撲腑struct鍜宼ypedef struct鍖哄埆涓:
    绛旓細C璇█缁撴瀯浣撲腑struct鍜宼ypedef struct鍖哄埆涓猴細澹版槑涓嶅悓銆佽闂笉鍚屻侀噸鏂板畾涔変笉鍚屻備竴銆佸0鏄庝笉鍚 1銆乻truct锛歴truct鍙互鐩存帴浣跨敤缁撴瀯浣撳悕瀛楀0鏄庣粨鏋勪綋銆2銆乼ypedef struct锛歵ypedef struct鐨勪负銆備慨楗扮粨鏋勪綋锛岀粨鏋勪綋鏈変簡鍒悕锛岄氳繃缁撴瀯浣撳埆鍚嶅0鏄庣粨鏋勪綋銆備簩銆佽闂笉鍚 1銆乻truct锛歴truct瀹氫箟鐨勭粨鏋勪綋鍙橀噺锛屽彲...
  • C璇█涓殑缁撴瀯浣鏄粈涔堟剰鎬濆晩?
    绛旓細C 璇█涓锛缁撴瀯浣(struct)鏄竴绉嶆暟鎹粨鏋勶紝鏄C璇█涓鑱氬悎鏁版嵁绫诲瀷(aggregate data type)鐨勪竴绫汇傜粨鏋勪綋鍙互琚0鏄庝负鍙橀噺銆佹寚閽堟垨鏁扮粍绛夛紝鐢ㄤ互瀹炵幇杈冨鏉傜殑鏁版嵁缁撴瀯銆傜粨鏋勪綋鍚屾椂涔熸槸涓浜涘厓绱犵殑闆嗗悎锛岃繖浜涘厓绱犵О涓虹粨鏋勪綋鐨勬垚鍛(member)锛屼笖杩欎簺鎴愬憳鍙互涓轰笉鍚岀殑绫诲瀷锛屾垚鍛樹竴鑸敤鍚嶅瓧璁块棶銆傚畾涔変笌澹版槑 缁撴瀯浣...
  • 璇锋暀C璇█涓璼truct鐨勭敤娉
    绛旓細鍦C璇█涓锛缁撴瀯浣擄紙struct锛夋槸涓绉嶅己澶х殑鏁版嵁缁勭粐宸ュ叿锛岀敤浜庣粍鍚堜笉鍚岀被鍨嬬殑鍙橀噺銆傚叾瀹氫箟褰㈠紡濡備笅锛歴truct 缁撴瀯浣撳悕 { 鎴愬憳鍙橀噺鎴栨暟缁 };缁撴瀯浣撳氨鍍忎竴涓鍣紝鍏跺唴閮ㄥ寘鍚涓垚鍛橈紝瀹冧滑鍙互鏄悓绫诲瀷鎴栦笉鍚岀被鍨嬬殑鍙橀噺鎴栨暟缁勶紝姣忎釜鎴愬憳閮借绉颁负缁撴瀯浣撶殑鎴愬憳銆備笅闈㈡槸涓浜涘叧浜庣粨鏋勪綋鐨勪娇鐢ㄥ疄渚嬶細1. 鍙湁缁撴瀯...
  • struct鍦c璇█涓鏄粈涔堟剰鎬?
    绛旓細鍦C璇█涓锛屽彲浠ヤ娇鐢缁撴瀯浣擄紙Struct锛夋潵瀛樻斁涓缁勪笉鍚岀被鍨嬬殑鏁版嵁銆傜粨鏋勪綋鐨勫畾涔夊舰寮忎负锛歴truct缁撴瀯浣撳悕锝 缁撴瀯浣撴墍鍖呭惈鐨勫彉閲忔垨鏁扮粍 锝;缁撴瀯浣撴槸涓绉嶉泦鍚堬紝瀹冮噷闈㈠寘鍚簡澶氫釜鍙橀噺鎴栨暟缁勶紝瀹冧滑鐨勭被鍨嬪彲浠ョ浉鍚岋紝涔熷彲浠ヤ笉鍚岋紝姣忎釜杩欐牱鐨勫彉閲忔垨鏁扮粍閮界О涓虹粨鏋勪綋鐨勬垚鍛橈紙Member锛夈備緥瀛愶細struct stu{ char *...
  • c璇█struct鏄粈涔堟剰鎬
    绛旓細C璇█涓璼truct鏄竴绉嶈嚜瀹氫箟鏁版嵁绫诲瀷锛屽畠涓庢暟缁勫拰鍩烘湰鏁版嵁绫诲瀷绫讳技锛屼絾鍏锋湁鏇村己鐨勭伒娲绘с傞氳繃浣跨敤struct锛屽彲浠ュ皢澶氫釜涓嶅悓绫诲瀷鐨勬暟鎹粍鍚堝湪涓璧凤紝褰㈡垚涓涓柊鐨勬暟鎹被鍨嬶紝浣垮緱绋嬪簭鏇存槗浜庣淮鎶ゅ拰浣跨敤銆備緥濡傦紝鍦ㄧ紪鍐欐枃浠剁鐞嗙▼搴忔椂锛屽彲浠ヤ娇鐢╯truct鏉ョ粍缁囨枃浠剁殑鍚勭灞炴э紙濡傛枃浠跺悕銆佸ぇ灏忋佸垱寤烘椂闂寸瓑锛夈俿truct鐨...
  • c璇█缁撴瀯浣鏄粈涔?
    绛旓細鍦C璇█涓锛缁撴瀯浣(struct)鎸囩殑鏄竴绉嶆暟鎹粨鏋勶紝鏄疌璇█涓仛鍚堟暟鎹被鍨(aggregate data type)鐨勪竴绫汇傜粨鏋勪綋鍙互琚0鏄庝负鍙橀噺銆佹寚閽堟垨鏁扮粍绛夛紝鐢ㄤ互瀹炵幇杈冨鏉傜殑鏁版嵁缁撴瀯銆傜粨鏋勪綋鍚屾椂涔熸槸涓浜涘厓绱犵殑闆嗗悎锛岃繖浜涘厓绱犵О涓虹粨鏋勪綋鐨勬垚鍛(member)锛屼笖杩欎簺鎴愬憳鍙互涓轰笉鍚岀殑绫诲瀷锛屾垚鍛樹竴鑸敤鍚嶅瓧璁块棶銆傜粨鏋勪綋浣滅敤锛...
  • 扩展阅读:typedef struct结构体 ... 结构体struct赋初值 ... c语言struct结构体数组 ... struct在c++语言中的用法 ... struct tm结构体 ... struct ex是结构体类型名 ... struct结构体内部赋值 ... c语言struct几种用法 ... c语言结构体简单例子 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网