【C语言自定义类型之----结构体,联合体和枚举】

news/2024/12/2 16:10:10/

一.结构体

1.结构体类型的声明

srruct tag
{nemer-list;//成员列表
}varible-list;//变量列表

结构体在声明的时候,可以不完全声明。 

例如:描述一个学生

struct stu
{char name[20];//名字int age;//年龄char sex[20];//性别
};//分号不能省略

2.结构体变量的创建和初始化

struct point
{int x;int y;
}p1;//声明类型的同时,定义变量p1struct point p2 = { 10,20 };//定义结构体变量p2,并初始化struct stu
{char name[20];int age;
};
struct stu s1 = { "zahngsan",20 };//初始化
struct stu s2 = { .age = 20,.name = "wnagwu" };//指定初始化//结构体嵌套初始化
struct Node
{int data;struct point p;struct Node* next;
}n1 = { 20,{4,5} ,NULL};  
struct Node n1 = { 20,{4,5} ,NULL };

3.结构体成员访问操作符

3.1直接访问操作符(. ),接受两个操作数。

使用方式:结构体变量.成员名

3.2对于结构体的指针而言的间接访问操作符(->)。

使用方式:结构体指针->成员名

3.3解引用操作符(*)。

指向结构体类型变量的指针也可以通过.方式访问成员,只不过要先通过*对该指针解引用

#include <stdio.h>
struct point
{int x;int y;
};int main()
{struct point p = { 3,4 };struct point* ptr = &p;ptr->x = 10;ptr->y = 20;printf("x=%d y=%d\n", ptr->x, ptr->y);return 0;
}

4.结构体内存对齐(计算结构体的内存大小)

首先得掌握对齐规则:

4.1.结构体成员的第一个成员对齐到和结构体起始位置偏移量为0的地址处.

4.2.其他成员的要对齐到某个数字(对齐数)的整数倍处.

对齐数=编译器默认的一个对齐数与该成员变量大小的较小值.

4.3.结构体总大小为最大对齐数(所有结构体成员中的最大对齐数)的整数倍.

4.4.如果结构体中嵌套了结构体,嵌套的结构体成员对齐到自己成员中最大对齐数的整数倍处

,结构体的整体大小就是所有成员中最大对齐数的整数倍处.

补充:

​​​​修改编译器的默认对齐数:

struct S
{char c1;int i;char c2;
};int main()
{struct S s = { 0 };printf("%d ", sizeof(s));return 0;
}

注:

当然我们也可以通过使用#pragma pack( ) ,来修改默认的对齐数,与此同时也可以用它来取消修改。

5.结构体实现位段(内存针对的是比特位,会发生截断现象)

位段的声明和结构体的生命是类似的,有两个不同:

5.1 位段的成员必须是int,unsigned int ,或者signed int,在c99中位段成员的类型也可以选择其他类型。

5.2位段的成员的后边有一个冒号和一个数字。

二.联合体(共用体)

1.联合体的声明

#include <stdio.h>//联合类型的声明
union Un
{char c;int i;
};
int main()
{//联合变量的定义union Un u = { 0 };//计算联合体变量的大小printf("%d\n", sizeof(u));return 0;
}

2.联合体的特点

联合体的成员是共用一块内存空间的,这样一个联合一体变量的大小,至少是最大成员的大小,(因为联合至少得有能力保存最大的那个成员)。

三.枚举(列举---把可能的值一一列举)

1.枚举类型的声明

enum color
{red,green,blue
};

{ }中的内容是枚举类型的可能取值,也叫枚举常量。当然 ,在声明枚举类型的时候也可以赋初值。 

2.枚举类型的优点

2.1增加代码的可读性和可维护性.

2.2和define定义的标识符比较枚举有类型检查,更加严谨.

2.3便于调试,预处理阶段会删除#define定义的符号.

2.4使用方便,一次可以定义多个常量.

2.5枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内声明.

3.枚举类型的使用

enum color
{red = 1,green=2,blue=4
};enum color clr = green;//使用枚举常量给枚举变量赋值

内容如有有错误,还望指出!

关注博主,优质内容不断更新!


http://www.ppmy.cn/news/1408942.html

相关文章

大模型学习笔记八:手撕AutoGPT

文章目录 一、功能需求二、演示用例三、核心模块流程图四、代码分析1&#xff09;Agent类目录创建智能体对象2&#xff09;开始主流程3&#xff09;在prompt的main目录输入主prompt和最后prompt4&#xff09;增加实际的工具集tools&#xff08;也就是函数&#xff09;5&#xf…

5. 多重背包问题 II(acwing)

文章目录 5. 多重背包问题 II题目描述动态规划一维数组三重循环&#xff08;超时&#xff09;二进制优化&#xff08;正确代码&#xff09; 二维数组三重循环&#xff08;超时&#xff09;二进制优化&#xff08;超出内存限制&#xff09; 5. 多重背包问题 II 题目描述 有 N种…

【MySQL核心SQL】

MySQL核心SQL 结构化查询语句SQL SQL是结构化查询语言&#xff08;Structure Query Language&#xff09;&#xff0c;它是关系型数据库的通用语言。 SQL主要可以划分为以下 3 个类别&#xff1a; DDL&#xff08;Data Definition Languages&#xff09;语句数据定义语言&am…

如何在Python中创建和使用全局变量和局部变量?

如何在Python中创建和使用全局变量和局部变量&#xff1f; 在Python中&#xff0c;变量根据它们被定义和使用的位置可以分为全局变量和局部变量。全局变量定义在函数或类的外部&#xff0c;而局部变量定义在函数或方法的内部。全局变量在整个程序运行期间都是可见的&#xff0…

(二)小案例银行家应用程序-创建DOM元素

● 上图的数据很明显是从我们账户数组中拿到了&#xff0c;我们刚刚学习了forEach&#xff0c;所以我们使用forEach来创建我们的DOM元素&#xff1b; const displayMovements function (movements) {movements.forEach((mov, i) > {const type mov > 0 ? deposit : w…

福州装修答疑 | 飘窗能不能砸掉?福州中宅装饰,福州装修

装修中的飘窗是一种常见的装饰元素&#xff0c;它不仅可以增加室内的采光和通风效果&#xff0c;还能为居室增添一份雅致和温馨。然而&#xff0c;很多业主在装修中都会遇到一个共同的问题&#xff1a;装修中的飘窗到底能不能砸&#xff1f;什么情况下可以砸&#xff1f;什么情…

【PostgreSQL】技术传承:使用Docker快速部署PostgreSQL数据库

前言 PostgreSQL的重要贡献者Simon Riggs因一起坠机事故不幸离世。Simon Riggs是英国著名的软件与服务领导者&#xff0c;也是PostgreSQL的主要开发者和贡献者。事故发生在英国当地时间3月26日13:41分&#xff0c;当时他驾驶的私人通用航空Cirrus SR22飞机在英国达克斯福德机场…

DOTS:Burst

目录 一&#xff1a;简介 1.1 Getting started 1.2 C# language support 1.2.1 HPC# overview 1.2.1.1 Exception expressions 1.2.1.2 Foreach and While 1.2.1.3 Unsupported C# features in HPC# 1.2.2 Static read-only fields and static constructor support 1.…