C语言-----自定义类型-----结构体&枚举&联合

简介: C语言-----自定义类型-----结构体&枚举&联合

结构体和数组一样,都是一群数据的集合,不同的是数组当中的数据是相同的类型,但是结构体中的数据类型可以不相同,结构体里的成员叫做成员变量

结构体类型是C语言里面的一种自定义类型,我们前面已经了解到过int,char,float,double等数据类型,结构体也是一种数据类型,而且是使用者自己定义的数据类型,用法如下:

1.结构体类型的声明

struct stu
{
   char name[20];
   int age;
   char sex;
};

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

结构体变量.结构体成员------对应的参数进行打印

struct stu
{
   char name[20];
   int age;
   char sex;
};
struct stu t={"小明",15,"男"};
struct stu
{
   char name[20];
   int age;
   char sex;
}s1={"小明",15,"男"};
//这种是在声明结构体同时定义变量
//也可以额外定义
struct stu s1={"小明",15,"男"};
struct stu s1={.name="小明",.age=15,.sex="男"};//这种可以不按照顺序

3.结构体传参

#include<stdio.h>
struct  s
{
  int num;
};
    struct s t = 100;
void print1(struct s t)
{
  printf("%d\n", t.num);
}
void print2(struct s *p)
{
  printf("%d\n", p->num);
}
int main()
{
  print1(t);
  print2(&t);
  return 0;
}

这里给出了传值,传地址两种方式,当参数较大时候,传参时候压栈会使得系统在时间空间的开销过大,所以尽量使用传地址的形式;

4.结构的自引用

一个结构体里面不能够包含一个相同的结构体,但是我们可以使用结构体指针,线性数据结构包括顺序表和链表,顺序表就是按照一定的顺序依次排列的结构,链表就是像链子一样串连起来的结构,链表包括数据域和指针域,数据域用来储存相应的数据,指针域便于找到下一个数据;

struct Node
{
   int time;
   struct Node* next;
};
//这种引用的方法是正确的,如果不使用指针,我们无法计算结构体的大小,所以们我们用结构体指针
typedef struct
{
   int time;
   Node* next;
}Node;
//这个是对匿名结构体的重新命名,这种写法是错误的因为Node没有定义就是用了Node*

5.结构体的大小--内存对齐现象

(1)结构体的第一个成员对齐到结构体变量起始偏移量是0的地方

(2)对齐数是编译器的默认对齐数8和结构体成员变量的较小值

(3)结构体的总大小是最大对齐数的整数倍,最大对齐数是所有成员对齐数的最大值

(4)结构体嵌套结构体的时候,嵌套的结构体成员对齐到自己成员最大对齐数的整数倍,整个结

构体的大小就是所有结构体成员最大对齐数的整数倍(把内置的嵌套结构体也当作一个结构体成

员);

(5)根据结构体的对齐规则,我们应该尽量让小的结构体成员放在一起,大的结构体成员放在一

起,这样就可以节省时间和空间;

6.结构体实现位段功能

(1)位段中的位是指二进制位,一个二进制位是一个比特,举个例子:int a:2;正常情况下,一个整型a

要占4个字节,也就是32个比特位,但是我们只为他分配2个比特位来存放数据,2的二进制表示是

0020,2个比特位就存放后两位20,这样就节省了6个比特位,由此可见,位段就是为了节省内存

空间,但是位段不具有跨平台性;

(2)位段有时候几个成员共同使用1个字节,所以不能对他直接取地址,所以应该定义变量,对变

量输入一个值,然后将这个变量的值赋值给结构体的成员;

8.枚举

枚举就是把可能的值一一列举,比如一周有7天

枚举类型的使用,当然,我们在使用的时候可以给枚举常量赋值;

9.联合体(共用体)

联合体的成员共同使用一块内存空间,一起使用的时候会影响彼此的数值,所以联合体的使用条件就是联合体的成员不会同时使用,互不影响;

这个案例是使用匿名联合体判断机器是大端还是小端;

10.联合体的大小

联合体的大小至少是最大成员的大小;

但是通过上面这个案例,我们可以知道联合体也有对齐现象,char是5个1,int是4;但是满足最大对齐数4的整数倍,所以是8;

相关文章
|
1天前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
32 19
|
21小时前
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
14 4
|
1月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
151 14
|
1月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
179 10
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
183 13
|
2月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
62 4
|
存储 C语言
【C语言】 条件操作符 -- 逗号表达式 -- []下标访问操作符,()函数调用操作符 -- 常见关键字 -- 指针 -- 结构体
【C语言】 条件操作符 -- 逗号表达式 -- []下标访问操作符,()函数调用操作符 -- 常见关键字 -- 指针 -- 结构体
【C语言】——define和指针与结构体初识
【C语言】——define和指针与结构体初识
|
存储 C语言
C语言初识-关键字-操作符-指针-结构体
C语言初识-关键字-操作符-指针-结构体
67 0