C语言基础—构造类型

数据类型

1.基本类型/基础类型

  • 整型

    • 短整型:short[int] --2字节

    • 基本整型:int --4字节

    • 长整型:long[int] --32位4字节/64位8字节

    • 长长整型:long long [int] (C99)

      注意:以上类型又都分为signed(有符号)和unsigned(无符号)

  • 浮点型

    • 单精度:float --4字节

    • 双精度:double --8字节

    • 长双精度: long double --(C99新增)

  • 字符型

    • char -- 1字节

2.指针类型

  • 数据类型*:int* char* float* --8字节

  • void*:通用类型指针(万能指针)--8字节

3.空值类型

  • void:无返回值,无形参(不能定义变量)

4.构造类型(自定义类型)

  • 结构体类型:struct

  • 共用体/联合体类型:union

  • 枚举类型:enum

结构体

结构体的定义(定义类型)

  • 定义:自定义数据类型的一种,关键字struct,结构体类型的变量可以存储多个不同数据类型的数据。
  • 语法:
struct 结构体名    //定义数据类型名字
{数据类型1 成员名称1;数据类型2 成员名称2;...
}

注意:结构体中定义的变量,称之为成员变量

  • 格式说明:

    • 结构体名:合法的标识符,建议首字母大写(所谓的结构体名,就是自定义类型的类型名称)

    • 数据类型n:C语言支持的所有类型(包括函数,函数在这里用函数指针表示)

    • 成员名称n:合法的标识符,就是变量的命名标准

    • 数据类型n成员名称n:类似于定义变量,定义了结构体中的成员

  • 注意:结构体在定义的时候,成员不能赋值
struct Cat
{int age = 5;    //错误double height;  //正确
}

常见的定义格式

  • 方式1:常规定义(命名结构体,只定义数据类型)---推荐

  • 方式2:定义匿名结构体(常用于作为其他结构体的成员使用)

  • 注意:定义匿名结构体的同时必须定义结构体成员,否则编译报错,结构体可以作为另一个结构体的成员(内嵌)

    总结:

    • 结构体可以定义在局部位置,也可以定义在全局位置(用的比较多,因为可以实现复用)

    • 全局位置的结构体名和局部位置的结构体名可以相同,遵循就近原则(和变量的定义同理)

  • 结构体类型的使用:

    利用结构体类型定义变量、定义数组、也可以作为函数的返回值和参数:结构体类型的使用与基本数据类型的使用类似。

结构体变量的定义(定义变量)

三种形式定义结构体变量

结构体变量也称之为结构体实例

  • 第一种:

    ①先定义结构体(定义数据类型)

    ②然后使用(使用数据类型定义变量)

  • 第2种

    ①在定义结构体的同时,定义结构体变量

    举例:

     struct A{int a;char b;}x,y;

    此时定义了一个结构体A,x和y是这个结构体类型的变量。

  • 第3种(不推荐)

    在定义匿名结构体的同时,定义结构体变量

struct A
{int a;char b;struct{int a1;char b1;}c,d;
}e;

此时定义了一个没有名字的结构体(匿名结构体):c,d是这个结构体类型的变量

  • 匿名结构体

    • 优点:少些一个结构体名称

    • 缺点:只能使用一次,定义结构体类型的同时必须定义变量

    • 应用场景:

      • 当结构体的类型只需要使用一次,并且定义类型的同时定义变量。

      • 作为其他结构体的成员使用。

  • 定义结构体的同时,定义结构体变量初始化

    • 结构体成员部分初始化时,大括号{}不能省略

    • 结构体成员,没有默认值,是随机值。

结构体变量的使用

  • 结构体变量访问结构体成员

    • 语法:

       结构体变量名.成员名;

      ①可以通过访问给成员赋值(存数据)

      ②可以通过访问获取成员的值(取数据)

    • 结构体变量未初始化,结构体的成员是随机值(和普通的变量、数组同理)

  • 结构体变量在定义时,可以初始化

    • 建议用大括号标明数据的范围

    • 结构体成员初始化,可以部分初始化(和数组类以),部分初始化时一定要带大括号标明数据的范围。

结构体数组的定义

  • 什么时候需要结构体数组

    比如:我们需要管理一个学生对象,只需要定义一个struct student kelei; 假如:我们需要管理一个班的学生对象,此时就需要定义一个结构体数组struct student stus[33];

  • 四种形式定义结构体数组

    • 第1种:结构体→结构体变量→结构体数组

    • 第2种:结构体→结构体数组,

    • 第3种:结构体、结构体数组一体化(含初始化)

    • 第4种:结构体、结构体数组一体化(不含初始化)

结构体数组的访问

语法:

结构体 -> 成员名

举例:

(*p).成员名
p -> 成员名

注意:

->[]共存的时候,它们的优先级关系:[] >  ->

构造体类型

构造体数组

举例:

#include <stdio.h>#pragma pack(1)
struct Student
{char *name;int age;float score[3];
};
#pragma pack()void stu_print(struct Student *stu)
{printf("学生的名字是:%s\n",stu -> name);printf("学生的年龄是:%d\n",stu -> age);printf("语文成绩是:%.2f\n",stu -> score[0]);printf("数学成绩是:%.2f\n",stu -> score[1]);printf("英语成绩是:%.2f\n",stu -> score[2]);
}int get_avg(struct Student *stu)
{struct Student *p = stu;for(; p < stu + 2; p++){float sum = 0;for(int i = 0; i < 3; i ++){sum += p -> score[i];}float avg = sum / 3;printf("%s的平均分为:%.2f\n",p -> name, avg);}
}
int main(int argc,char *argv[])
{struct Student stu = {"张三",20,{90,88,75}};stu_print(&stu);struct Student stus[] = {{"李四",21,{67,87,68}},{"王五",22,{76,92,70}}};get_avg(stus);return 0;
}

构造体指针

  • 定义:结构体类型的指针变量指向结构体变量或者数组的起始地址。

  • 语法:

struct 结构体名 *指针变量列表;
  • 举例
#include <stdio.h>struct Product
{char *name;int id;int or_price;int now_price;char *production_deta;char *due_deta;
};typedef struct Product Pro;
//打印商品信息
void product_print(Pro *p)
{Pro *t_p = p;printf("名字是:%s\n",t_p -> name);printf("商品ID为:%d\n",t_p -> id);printf("原价为:%d\n",t_p -> or_price);printf("现价为:%d\n",t_p -> now_price);printf("生产日期:%s\n",t_p -> production_deta);printf("到期时间是:%s\n",t_p ->due_deta);
}
int main(int argc,char *argv[])
{//typedef struct Product Pro;Pro p1 = {"麻辣公主",10001,100,10,"2025,1,10","2025,2,10"};product_print(&p1);return 0;
}

构造体成员的访问

结构体成员访问

  • 结构体数组名访问结构体成员

    • 语法

结构体数组名 -> 成员名;
(*结构体数组名).成员名;
  • 结构体成员访问符

    • .左侧是结构体变量,也可以叫做结构体对象访问成员访问符,右侧是结构体成员。

    • ->左侧是结构体指针,也可以叫做结构体指针访问成员符右侧是结构体成员

    • 举例

struct Person *p = persons; // p就是结构体指针
for(; p < persons + 3; p++)printf("%s:%d\n",p -> name, p -> count);
结构体是自定义数据类型,它是数据类型,用法类似于基本类型的 int
结构体数组它是存放结构体对象的数组,类似于 int 数组存放 int 数据;
基本类型数组怎么用,结构体数组就怎么用 ---> 可以遍历,可以作为形式参数,也可
以做指针等;

结构体类型求大小 

字节对齐

  • 字节对齐的原因:
       1. 硬件要求 某些硬件平台(如 ARM x86 )要求特定类型的数据必须对齐到特定地址,否则会 引发性能下降或硬件异常。
        2. 优化性能 对齐的数据访问速度更快。例如, CPU 访问对齐的 int 数据只需一次内存操作, 而未对齐的数据可能需要多次操作。
  • 字节对齐规则
        1. 默认对齐规则
 结构体的每个成员按其类型大小和编译器默认对齐数(通常是类型的自然对齐数)对
 齐。 结构体的总大小必须是最大对齐数的整数倍。
        2. 对齐细节
基本类型的对齐数 char 1 字节)、 short 2 字节)、 int 4 字节)、 double (8字节)。
结构体成员的对齐 :每个成员的起始地址必须是对齐数的整数倍。
结构体总大小的对齐 :结构体的总大小必须是其最大对齐数的整数倍
        3. #pragma pack(n) 的影响 使用 #pragma pack(n) 可以强制指定对齐数为 n n 1 、 2、 4 8 16 )。此时:
每个成员的对齐数取 n 和其类型大小的较小值。
结构体的总大小必须是 n 和最大对齐数中的较小值的整数倍。

共用体

定义:使几个不同变量占用同一段内存的结构。共用体按定义中需要存储空间最大的成员来分
配存储单元,其他成员也是使用该空间,它们的首地址是相同。
定义格式:
union 共用体名称
{数据类型 成员名;数据类型 成员名;...
}
共用体的定义和结构体类似。
1.可以有名字,也可以匿名
2.共用体在定义时也可以定义共用体变量
3.共用体在定义时也可以初始化成员
4.共用体也可以作为形参和返回值类型使用
5.共用体也可以定义共用体变量
...
         也就是说,结构体的语法,共用体都支持
注意:
        共用体弊大于利,尽量少用,一般很少用;
        共用体变量在某一时刻只能存储一个数据,并且也只能取出一个数
        共用体所有成员共享同一内存空间,同一时间只能存储一个值,可能导致数据覆盖
        共用体和结构体都是自定义数据类型,用法类似于基本数据类型
         共用体可以是共用体的成员,也可以是结构体的成员
        结构体可以是结构体的成员,也可以是共用体的成员

枚举类型

建议:如果定义不相干的常量,使用宏定义(符号常量);如果需要定义一组相关的常量,如月份0~11,星期0-6,方向0-3等,使用枚举,进行统一管理。以后正式开发中,switch的case后访问的就是枚举中的常量。

  • 定义

    我们一般情况下,定义常量使用宏定义(#define 宏名称 值),宏定义非常适合没有关联关系的常量;但是有时候我们可能需要对一组拥有关联关系的量进行定义,如月份0~11,星期0-6,方向0-3等,那么使用宏定义,就不是很清晰,也不方便统一管理,这个时候就需要用到枚举。

    枚举的存在就是将多个拥有关联关系的常量组合到一起,提高代码的可读性。

  • 说明

    枚举类型定义了一组常量,我们在开发中直接使用这些常量。(常用)

    当然枚举类型也可以类似于结构体一样定义变量等操作。(不常用)

    枚举常量有默认值,从0开始依次+1我们可以在定义时指定它的默认值,如果个别没有斌值,可以根据赋值依次+1推导。

  • 特点

    定义了一组常量,类似于定义了多个符号常量(宏定义)。

    提高了代码的可读性。

  • 语法:

  • 定义枚举类型名以后就可以定义该枚举类型的变量。(枚举的成员是常量)

enum 枚举类型名 变量列表;

       在定义枚举类型的同时定义该枚举类型的变量。

enum 枚举类型名(枚举元素列表) 变量列表;

      直接定义枚举变量(变量)。

enum(枚举元素列表) 变量列表;

typedef

  • 说明:给类型重命名,不会影响到类型本身。

  • 作用:给己有的类型起别名

  • 格式:

typedaef 已有类型名 新类型名;
  • 举例:
#include <stdio.h>struct Product
{char *name;int id;int or_price;int now_price;char *production_deta;char *due_deta;
};typedef struct Product Pro;
//打印商品信息
void product_print(Pro *p)
{Pro *t_p = p;printf("名字是:%s\n",t_p -> name);printf("商品ID为:%d\n",t_p -> id);printf("原价为:%d\n",t_p -> or_price);printf("现价为:%d\n",t_p -> now_price);printf("生产日期:%s\n",t_p -> production_deta);printf("到期时间是:%s\n",t_p ->due_deta);
}
int main(int argc,char *argv[])
{//typedef struct Product Pro;Pro p1 = {"麻辣公主",10001,100,10,"2025,1,10","2025,2,10"};product_print(&p1);return 0;
}
  • 应用场景:

    • 数据类型复杂(结构体、共用体、枚举、结构体指针、无符号的长整型)时使用

    • 为了跨平台的兼容性,例如:

    1. size_t:类型重名后的数据类型:typedef unsigned long size_t;

    2. unit16:类型重命名后的数据类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年高压电工考试真题分享

以下是一些高压电工考试题&#xff1a; 单选题 1、高压架空线路的档距一般为&#xff08; &#xff09;。 A. 20 - 30m B. 30 - 50m C. 50 - 80m D. 80 - 100m 答案&#xff1a;B。解析&#xff1a;高压架空线路档距一般在 30 - 50m&#xff0c;这样的档距能较好地保证线…

什么是SQL作业

SQL作业是在数据库服务器上按特定时间或间隔自动执行的计划任务或流程&#xff0c;这些作业由Microsoft SQL Server中的SQL Server代理管理&#xff0c;对于自动执行日常任务&#xff08;如数据库系统中的备份、数据导入和报告生成&#xff09;以及确保及时准确地处理和更新数据…

【数据分享】基于联合国城市化程度框架的全球城市边界数据集(免费获取/Shp格式)

在全球城市化进程不断加快的今天&#xff0c;如何精准定义和测量“城市”成为关键问题。不同国家和机构采用不同的标准&#xff0c;导致全球城市化水平的统计结果存在较大差异。同时&#xff0c;由于数据来源分散、标准不统一&#xff0c;获取一套完整、可比的全球城市边界数据…

刘火良FreeRTOS内核实现与应用学习之6——多优先级

在FreeRTOS中&#xff0c;数字优先级越小&#xff0c;逻辑优先级也越小&#xff1b;在任务创建时&#xff0c;会根据任务的优先级将任务插入就绪列表不同的位置。 List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就绪列表是一个数组&#xff0c;数组中存储的是就绪任务TCB(…

生成信息提取的大型语言模型综述

摘要 信息提取&#xff08;IE&#xff09;旨在从简单的自然语言文本中提取结构知识。最近&#xff0c;生成型大型语言模型&#xff08;LLMs&#xff09;在文本理解和生成方面表现出了显著的能力。因此&#xff0c;已经提出了许多基于生成范式将LLM集成到IE任务中的工作。为了对…

简单谈谈很火的MCP( Model Context Protocol,模型上下文协议)

MCP( Model Context Protocol&#xff0c;模型上下文协议)是由Anthropic推出的开放协议&#xff0c;并非独立的大模型&#xff0c;而是连接大模型与外部工具/数据源的标准化接口‌&#xff0c;旨在解决AI工具开发中接口不统一、跨模型共享困难等问题。‌ 一、工作原理 MCP 协…

解决linux centos ubuntu等无法启动谷歌chrome浏览器问题

命令启动chrome时候提示&#xff1a; Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 解决无法启动谷歌chrome浏览器&#xff1a; cd /usr/bin 发现目录下有 google-chrome google-chrome-stable 执行&#xff1a; vim go…

深入解析缓冲区:计算机世界的“蓄水池”与“加速器”

引言 想象这样一个场景&#xff1a; 你的手机正在播放4K视频&#xff0c;同时下载大型文件 视频画面流畅无卡顿&#xff0c;下载速度稳定在满带宽 但手机的内存只有8GB&#xff0c;下载文件的大小却超过20GB 这看似矛盾的现象背后&#xff0c;缓冲区&#xff08;Buffer&am…

网络故障诊断

一 网络故障诊断的方法 1 试错法&#xff1a;通过推测提出解决方案&#xff0c;最后得出故障原因的方法。 2 参照法&#xff1a;是一种比较快速解决网络故障的方法&#xff0c;只有当故障设备与正常工作设备具有相近的条件时&#xff0c;才可以使用参照法。 3 替换法&#xff1…

界面控件Telerik和Kendo UI 2025 Q1亮点——AI集成与数据可视化

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

ollama迁移已下载的单个模型到服务器

ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的&#xff0c;部署和运行都很简单&#xff0c;是否高效就另说了。但最起码&#xff0c;他能充分利用用户的硬件设备&#xff0c;在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的&#xf…

怎么对asp.web api进行单元测试?

在 ASP.NET Web API 中进行单元测试是一种确保代码质量和功能正确性的重要实践。单元测试的重点是针对 API 控制器中的逻辑进行测试&#xff0c;而不依赖于外部依赖&#xff08;如数据库、文件系统或网络请求&#xff09;。以下是实现 ASP.NET Web API 单元测试的步骤和方法&am…

UDP视频传输中的丢包和播放花屏处理方法

在处理UDP视频传输中的丢包和花屏问题时,需要结合编码优化、网络传输策略和接收端纠错技术。以下是分步骤的解决方案: 1. 前向纠错(FEC,Forward Error Correction) 原理:在发送数据时附加冗余包,接收方通过冗余信息恢复丢失的数据包。 实现方法: 使用Reed-Solomon、XO…

WebGL图形编程实战【3】:矩阵操控 × 从二维到三维的跨越

上一篇文章&#xff1a;WebGL图形编程实战【2】&#xff1a;动态着色 纹理贴图技术揭秘 仓库地址&#xff1a;github…、gitee… 矩阵操控 矩阵变换 回到前面关于平移缩放、旋转的例子当中&#xff0c;我们是通过改变传递进去的xy的值来改变的。 在进行基础变换的时候&…

并发编程--共享内存SHM

共享内存SHM 文章目录 共享内存SHM1. 基本概念2. 函数接口2.1 创建或打开SHM对象2.2 映射 / 解除映射SHM对象2.3 其余操作2.4示例代码 1. 基本概念 共享内存&#xff0c;顾名思义&#xff0c;就是通过不同进程共享一段相同的内存来达到通信的目的&#xff0c;由于SHM对象不再交…

Redis中的数据类型与适用场景

目录 前言1. 字符串 (String)1.1 特点1.2 适用场景 2. 哈希 (Hash)2.1 特点2.2 适用场景 3. 列表 (List)3.1 特点3.2 适用场景 4. 集合 (Set)4.1 特点4.2 适用场景 5. 有序集合 (Sorted Set)5.1 特点5.2 适用场景 6. Redis 数据类型的选型建议结语 前言 Redis 作为一款高性能的…

科技赋能建筑业变革:中建海龙创新引领高质量发展新路径

在建筑工业化浪潮中&#xff0c;中建海龙科技有限公司&#xff08;以下简称“中建海龙”&#xff09;凭借深厚的技术积累与持续创新&#xff0c;成为推动行业转型升级的标杆企业。作为中国建筑国际集团旗下核心科技力量&#xff0c;中建海龙深耕模块化集成建筑&#xff08;MiC&…

Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发

vue 开发table 列表时&#xff0c;需要动态调整列字段的顺序和显示隐藏 实现效果如图所示&#xff1a; vue 组件代码 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…

故障扭曲棱镜反射照片效果ps特效滤镜样机 Distorted Mirror Poster Effect

只需单击几下即可执行令人着迷的高质量图像和摄影&#xff01;此照片效果包含智能对象图层&#xff0c;提供完全自定义、易用性和多功能性的工作流程。只需双击其缩略图打开所需的图层&#xff0c;删除占位符镜头&#xff0c;添加图形&#xff0c;保存它&#xff0c;然后观看 P…

基于dify平台批量分析excel格式信息

如何以表格形式批量输入一些信息&#xff0c;然后让大模型以对话应用形式逐条进行推理分析&#xff1f; 这里提供一个分步解决方案&#xff0c;结合 Dify平台功能 和 API调用优化 的思路&#xff0c;既保证效率又降低复杂度&#xff1a; 1. 优先检查 Dify 的「数据集」功能 Di…