云计算百科
云计算领域专业知识百科平台

带你一口气搞懂C语言中的三大构造数据类型(结构体、共用体/联合体、枚举)

一、结构体

1.结构体的声明

struct 名称

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

};

注意:

1. 声明结构体的时候,结构体{}后面的不能省。

2. 结构体成员之间用隔开。

3. struct后面的名称可以省略,省略后就是一个匿名结构体。

2.结构体变量定义

结构体类型 变量名;

struct date mydate;

3.结构体初始化

全部初始化:

struct date mydate = {2026, 8,6};
struct datetime
{
struct date mdate;
struct time mtm;
};
struct datetime mydt = {{2026,8,6}, {14,5,23}};

部分初始化:

struct date mydate =
{
.year = 2024,
.day = 6,
};

4.结构体数据成员的访问

通过结构体变量访问结构体成员:

结构变量变量名.成员1

结构变量变量名.成员2

结构变量变量名.成员3

通过结构体指针访问结构体成员:

结构体指针->成员1

结构体指针->成员2

结构体指针->成员3

5.结构体的存储方式

结构体对齐原则:

1. 结构体成员在内存中存储时,成员必须存储在自己字节大小的整数倍位置;

2. 结构体整体占的内存大小,是结构体中最大成员字节数的整数倍。

注意:

1. 在不同位系统下,相同结构体在内存中占的字节空间可能不一样

原因:64位系统long/指针类型占8字节;32位系统long/指针类型占4字节。

2. 可以强制让结构体按指定字节数对齐。

6.结构体作为参数传递函数

如果要在被调函数中修改主调函数中的结构体变量,则传递结构体变量的地址;

如果在被调函数中使用主调函数中定义的结构体变量,可以值传递,也可以传地址。

7.结构体数组

struct 名称 数组名[元素个数]

struct 名称 数组名[元素个数] = {{}{}{}}

数组名[下标]; —》数据类型:”struct 名称类型

结构体数组中的成员访问:

struct stu ss[4] = {

{"zhangsan", 23, 90}, {"lisi", 22, 67},

{"wanger", 24, 89}, {"zhaowu", 20, 99}

};

//struct stu
//printf("%s %d %d\\n", ss[i].name, ss[i].age, ss[i].score);
//struct stu *
//printf("%s %d %d\\n", (ss+i)->name, (ss+i)->age, (ss+i)->score);
//struct stu
//printf("%s %d %d\\n", (*(ss+i)).name, (*(ss+i)).age, (*(ss+i)).score);

二、共用体/联合体

1.基本语法

声明共用体:
union 名称
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
};
定义共用体变量:
union 名称 变量名;

特点:

1. 共用体中的所有成员共用一块内存空间;

2. 共用体在内存中占的字节数取决于最大字节数的成员。

3. 共用体存储的数据,和最后一次的成员赋值有关。

2.内存大小端存储方式

小端:内存的高地址存储高字节位,内存的低地址存储低字节位;

大端:内存的高地址存储低字节位,内存的低地址存储高字节位;

大小端测试方式:

指针方式:

int main(void)
{
int a = 0x11223344;
char *p = (char *)&a;
if (*p == 0x44)
{
printf("small\\n");
}
else
{
printf("big\\n");
}
}

共用体方式:

union s
{
int a;
char b;
};
int main(void)
{
union s tmp;
tmp.a = 1;
if (tmp.b)
{
printf("small\\n");
}
else
{
printf("big\\n");
}
return 0;
}

三、枚举类型

1.基本语法

枚举类型的声明:
enum 名称
{
枚举常量1,
枚举常量2,
枚举常量3,
};

注意:

1. 枚举里面的成员都是枚举常量,都是整形常量,所以不需要写数据类型;

2. 枚举常量根据行业规范,一般写成大写方式,和普通变量区分;

3. 枚举中的枚举常量,类似于整形符号常量,可以直接被引用;

4. 枚举中的常量和常量之间用逗号隔开;

5. 枚举中的枚举常量如果没有给定初始值,则默认从0开始;

如果给其中的某个枚举常量给定了初始值,则后面的常量以该值为基础自增1

2.枚举变量

enum 名称 变量名;

枚举变量是枚举类型,但本质是一个整形。

变量名 = 枚举常量;

赞(0)
未经允许不得转载:网硕互联帮助中心 » 带你一口气搞懂C语言中的三大构造数据类型(结构体、共用体/联合体、枚举)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!