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.rhkb.cn/news/42394.html

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

相关文章

交流电机类型及其控制技术

交流电机可分为同步电机和异步电机两大种类&#xff0c;如果电机转子的转速与定子旋转磁场的转速相等&#xff0c;转子与定子旋转磁场在空间同步地旋转&#xff0c;这种电机就称为同步电机。如果电机转子的转速不等于定子旋转磁场的转速&#xff0c;转子与定子旋转磁场在空间旋…

「HTML5+Canvas实战」星际空战游戏开发 - 纯前端实现 源码即开即用【附演示视频】

纯前端实现星际空战游戏【简易版】 博主上次分享的简易版飞机大战收到了不少建议,今天再给大家来一波福利!带来全新升级的飞机大战进阶版!不仅拥有更丰富的游戏机制和更精美的游戏画面,还加入了超燃的BOSS战斗系统。源码完全免费开放,拿来即用无门槛,欢迎感兴趣的小伙伴…

7-项目负责人-添加产品

点击一个项目集&#xff0c;进入项目集的页面。可以进行产品、项目、人员和干系人的管理。 点击“添加产品”&#xff0c;为该项目集添加关联产品。一个项目集可以关联多个产品。还可以通过“产品线”管理一些列产品。 产品。

深度赋能!北京智和信通融合DeepSeek,解锁智能运维无限可能

在数字化飞速发展的今天&#xff0c;传统运维模式面临着设备规模激增、故障复杂度攀升、人工响应滞后等多重挑战。随着DeepSeek、腾讯元宝等AI大模型的兴起&#xff0c;为传统运维模式带来了新的变革。 北京智和信通基于DeepSeek大模型技术&#xff0c;将AI和运维场景深度融合&…

flex和bison笔记

文章目录 flex语法&#xff1a;定义部分:规则部分:flex全局变量&#xff1a;yyin: bison和flex联合编译: flex词法分析 bison语法分析 flex有两种使用方式&#xff0c;一种是flex单独做一个词法分析程序&#xff0c;另一种是flex和bison协同构建一个词法语法分析程序 我们在北…

rbpf虚拟机-call指令

文章目录 一、概述背景知识 二、call 指令的主要方法2.1 注册辅助函数2.2 执行辅助函数 三、完整代码示例与详解3.1 示例辅助函数3.2 测试虚拟机的 call 指令测试代码代码解析 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-call指令] ❤博主广交技术…

Java构造函数与普通函数

1.概解 tips&#xff1a; 1.声明函数主要用public/private&#xff0c;public可以在其他函数中访问。 2.public后面跟函数返回类型&#xff0c;void表示无返回值。 3.main函数是自动执行的构造函数&#xff0c;而其他函数除非被调用则不会被自动执行 运行结果&#xff1a…

MySQL: 创建两个关联的表,用联表sql创建一个新表

MySQL: 创建两个关联的表 建表思路 USERS 表&#xff1a;包含用户的基本信息&#xff0c;像 ID、NAME、EMAIL 等。v_card 表&#xff1a;存有虚拟卡的相关信息&#xff0c;如 type 和 amount。关联字段&#xff1a;USERS 表的 V_CARD 字段和 v_card 表的 v_card 字段用于建立…

A2 最佳学习方法

记录自己想法的最好理由是发现自己的想法&#xff0c;并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈&#xff1a; 做培训或者写文章&#xff…

六十天前端强化训练之第三十二天之Babel 转译配置大师级深度讲解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、核心概念与知识体系详解 1. Babel 工作原理全景解析 二、完整配置方案&#xff08;带详细注释&#xff09; 1. 进阶版 .babelrc 配置 2. Webpack 集成配置&#xff08…

Linux 下安装和使用 Jupyter Notebook

Jupyter Notebook / Lab 是 Python 开发和数据分析中不可或缺的工具。为了避免环境污染&#xff0c;推荐使用虚拟环境方式安装并启动它。本教程将教你如何&#xff1a; 安装 Python、pip、venv使用虚拟环境安装 Jupyter设置登录密码启动并远程访问编写一个一键启动脚本&#x…

【云成本优化案例】K8s计费探针让跨境电商企业节省30%云预算

01. 财务“谜案”&#xff1a;消失的30%云预算 "我们的K8s集群资源利用率高达78%&#xff0c;但业务部门总说云账单对不上。"某跨境电商企业CTO的报案记录&#xff0c;揭开了一场云原生时代的财务谜案。该企业技术团队自查了所有资源配额和HPA配置&#xff0c;却始…

PyTorch 分布式训练(Distributed Data Parallel, DDP)简介

PyTorch 分布式训练&#xff08;Distributed Data Parallel, DDP&#xff09; 一、DDP 核心概念 torch.nn.parallel.DistributedDataParallel 1. DDP 是什么&#xff1f; Distributed Data Parallel (DDP) 是 PyTorch 提供的分布式训练接口&#xff0c;DistributedDataPara…

蓝桥杯[每日一题] 真题:连连看

题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中&#xff0c;每个格子中都有一个整数&#xff0c;第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等&#xff0c;且它…

Linux环境下安装部署Docker

windows下连接Linux&#xff1a; 打开终端&#xff1a; //ssh远程连接 ssh root192.168.xx.xx//输入账号密码 root192.168.xx.xxs password: ssh连接成功&#xff01; 安装Docker&#xff1a; //安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …

k近邻算法K-Nearest Neighbors(KNN)

算法核心 KNN算法的核心思想是“近朱者赤&#xff0c;近墨者黑”。对于一个待分类或预测的样本点&#xff0c;它会查找训练集中与其距离最近的K个样本点&#xff08;即“最近邻”&#xff09;。然后根据这K个最近邻的标签信息来对当前样本进行分类或回归。 在分类任务中&#…

Appium中元素定位之一个元素定位API

应用场景 想要对按钮进行点击&#xff0c;想要对输入框进行输入&#xff0c;想要获取文本框的内容&#xff0c;定位元素是自动化操作必须要使用的方法。只有获取元素之后&#xff0c;才能对这个元素进行操作。 在 Java 中使用 Appium 定位元素时&#xff0c;可以通过多种方式…

Dify 服务器部署指南

1. 系统要求 在开始部署之前&#xff0c;请确保你的服务器满足以下要求&#xff1a; 操作系统&#xff1a;Linux&#xff08;推荐使用 Ubuntu 20.04 或更高版本&#xff09;内存&#xff1a;至少 4GB RAM存储&#xff1a;至少 20GB 可用空间网络&#xff1a;稳定的互联网连接…

Sa-Token

简介 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 官方文档 常见功能 登录认证 本框架 用户提交 name password 参数&#xff0c;调用登…

ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件

作者的话 近期发现有些兄弟的ICE-2000仿真器链接DSP报错&#xff0c;然后test第四步不通过&#xff0c;我就拿我的仿真器也试了一下&#xff0c;发现ADI悄咪咪的在线升级仿真器固件&#xff0c;有些兄弟不会操作&#xff0c;就会导致仿真器升级失败&#xff0c;连不上目标板&a…