網(wǎng)站首頁 編程語言 正文
嵌套結(jié)構(gòu)體
格式:
typedef struct 結(jié)構(gòu)體名 {
struct 結(jié)構(gòu)體名1 結(jié)構(gòu)體變量名1;
struct 結(jié)構(gòu)體名2 *結(jié)構(gòu)體指針變量名1;
}結(jié)構(gòu)體別名_t;
定義結(jié)構(gòu)體普通的變量,訪問結(jié)構(gòu)體中的成員:
結(jié)構(gòu)體別名_t 普通結(jié)構(gòu)體變量名;
普通結(jié)構(gòu)體變量名.結(jié)構(gòu)體變量名1.成員名;
普通結(jié)構(gòu)體變量名.結(jié)構(gòu)體指針變量名1->成員名;
定義結(jié)構(gòu)體指針變量,訪問結(jié)構(gòu)體中的成員
結(jié)構(gòu)體別名_t *結(jié)構(gòu)體指針變量名;
結(jié)構(gòu)體指針變量名->結(jié)構(gòu)體變量名1.成員名;
結(jié)構(gòu)體指針變量名->結(jié)構(gòu)體指針變量名1->成員名;
總結(jié),訪問結(jié)構(gòu)體中的成員時,具體使用.還是->,需要看當(dāng)前的結(jié)構(gòu)體變量的類型。
測試用例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Person
{
char *name;
int age;
char sex;
} Person_t;
typedef struct Student
{
Person_t per;
int score;
} Student_t;
typedef struct Teacher
{
Person_t *per_p;
int salary;
} Teacher_t;
int main(int argc, const char *argv[])
{
/*your code*/
// 1. 定義結(jié)構(gòu)體類型的變量
Student_t stu1;
// 2. 初始化結(jié)構(gòu)體中的成員
stu1.per.name = (char *)malloc(sizeof(char) * 20);
if (stu1.per.name == NULL)
{
printf("malloc failed\n");
return -1;
}
strcpy(stu1.per.name, "zhoukai");
stu1.per.age = 18;
stu1.per.sex = 'M';
stu1.score = 99;
printf("姓名:%s 年齡:%d 性別:%c 工資:%d\n",\
stu1.per.name, stu1.per.age, stu1.per.sex, stu1.score);
// 使用Teacher_t定義結(jié)構(gòu)體指針類型的變量,使用malloc分配空間
Teacher_t *t=(Teacher_t *)malloc(sizeof(Teacher_t));
if(NULL==t)printf("malloc memory filed!\n");
// 對Teacher_t類型中的per_p成員,使用malloc分配空間,
t->per_p =(Person_t *)malloc(sizeof(Person_t));
if(NULL==t->per_p)
{
printf("malloc memory filed!\n");
return -1;
}
// 對Person_t中的name成員,使用malloc分配空間。
t->per_p->name=(char *)malloc(sizeof(char)*20);
if(NULL==t->per_p->name)
{
printf("malloc memory filed!\n");
return -1;
}
// 分配堆區(qū)空間時,從外向內(nèi)進行分配;釋放空間時,從內(nèi)向外分配空間。
strcpy(t->per_p->name,"yao");
t->per_p->age=10;
t->per_p->sex='M';
t->salary=100000;
printf("姓名:%s 年齡:%d 性別:%c 工資:%d\n",\
t->per_p->name,t->per_p->age, t->per_p->sex,t->salary);
//釋放空間
free(t->per_p->name);
t->per_p->name=NULL;
free(t->per_p);
t->per_p=NULL;
free(t);
t=NULL;
return 0;
}
圖解:
結(jié)構(gòu)體內(nèi)存對齊
32位的操作系統(tǒng)
結(jié)構(gòu)體中成員內(nèi)存對齊,只考慮基本的數(shù)據(jù)類型,不考慮構(gòu)造類型,構(gòu)造類型最終也是由基本類型構(gòu)成。
1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員最大的成員只占4/8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,long int, long long int, float, double 類型,
此成員的地址是4的整數(shù)倍;
編譯成32位的可執(zhí)行程序:
gcc ***.c -m32
測試:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
typedef struct{
char name[20];
char sex;
char age;
}A_t;
//2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
typedef struct{
char name[20];
short age;
char sex;
// 保留一個字節(jié)
}B_t;
typedef struct{
char name[20];
char sex;
// 保留一個字節(jié)
short age;
}C_t;
//3> 如果結(jié)構(gòu)體中的成員最大的成員只占4/8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
typedef struct{
char name[20];
char sex;
// 保留三個字節(jié)
int age;
}D_t;
typedef struct{
char name[20];
char sex;
// 保留一個字節(jié)
short score;
int age;
}E_t;
typedef struct{
char name[20];
char sex;
// 保留一個字節(jié)
short score;
long long int age;
}F_t;
typedef struct{
char *name;
char sex;
// 保留一個字節(jié)
short score;
long long int age;
}G_t;
typedef struct{
char *name;
char sex;
// 保留一個字節(jié)(不同類型的在同一行,不同的那個從后往前補!!!)
short score;
char salary;
long long int age;
}H_t;
int main(int argc, const char *argv[])
{
/*your code*/
printf("A_t type size=%d\n",sizeof(A_t));//22
printf("B_t type size=%d\n",sizeof(B_t));//24
printf("C_t type size=%d\n",sizeof(C_t));//24
printf("D_t type size=%d\n",sizeof(D_t));//28
printf("E_t type size=%d\n",sizeof(E_t));//28
printf("F_t type size=%d\n",sizeof(F_t));//32
printf("G_t type size=%d\n",sizeof(G_t));//16
printf("H_t type size=%d\n",sizeof(H_t));//20
printf("-----------G_t中成員的地址-----------\n");
G_t g;
printf("G_t成員 char *name 的地址%p\n",g.name);
printf("G_t成員 char sex 的地址%p\n",&g.sex);
printf("G_t成員 short score 的地址%p\n",&g.score);
printf("G_t成員 long long int age 的地址%p\n",&g.age);
printf("-----------H_t中成員的地址-----------\n");
H_t h;
printf("H_t成員 char *name 的地址%p\n",h.name);
printf("H_t成員 char sex 的地址%p\n",&h.sex);
printf("H_t成員 short score 的地址%p\n",&h.score);
printf("H_t成員 char salary 的地址%p\n",&h.salary);
printf("H_t成員 long long int age 的地址%p\n",&h.age);
return 0;
}
64位的操作系統(tǒng)
結(jié)構(gòu)體中成員內(nèi)存對齊,只考慮基本的數(shù)據(jù)類型,不考慮構(gòu)造類型,構(gòu)造類型最終也是由基本類型構(gòu)成。
1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員最大的成員只占4個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員最大的成員只占8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為8的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,float類型,
此成員的地址是4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員為long int, long long int, double 類型,
此成員的地址是8的整數(shù)倍;
編譯成64位的可執(zhí)行程序:
8的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,float類型,
此成員的地址是4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員為long int, long long int, double 類型,
此成員的地址是8的整數(shù)倍;
編譯成64位的可執(zhí)行程序:
gcc ***.c
原文鏈接:https://distant-rove.blog.csdn.net/article/details/127782096
相關(guān)推薦
- 2022-10-02 iOS實現(xiàn)可拖動的浮動菜單_IOS
- 2022-05-10 淺談patch,以及里面的diff算法
- 2022-11-02 使用ggsignif優(yōu)雅添加顯著性標(biāo)記詳解_R語言
- 2022-02-28 純 CSS實現(xiàn)根據(jù)元素已知的寬度設(shè)置高度以及注意事項
- 2022-09-13 go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解_Golang
- 2022-06-22 C++深入探究類與對象之友元與運算符重載_C 語言
- 2022-09-30 Python學(xué)習(xí)之pip包管理工具的使用_python
- 2022-10-04 python中xml格式的轉(zhuǎ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之認(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同步修改后的遠程分支