C语言入门第五天(复合类型)

一、结构体

1.结构体的概述

结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”

2.结构体变量的定义和初始化

定义结构体变量的方式:

  1. 先声明结构体类型再定义变量名
  2. 在声明类型的同时定义变量
  • 语法格式:
    // 先声明结构体类型再定义变量名
    struct 结构体名 {成员列表
    };
    struct 结构体名 变量名;// 在声明类型的同时定义变量
    struct 结构体名 {成员列表
    }变量名;

  • 示例代码:
// 结构体类型的定义
struct stu {char name[50];int age;
};// 先定义类型,再定义变量(常用)
struct stu s1 = {"mike", 18};// 定义类型同时定义变量
struct stu2 {char name[50];int age;
}s2 = {"yoyo", 19};

3.结构体成员的使用

  • 如果是结构体变量,通过 . 操作成员
  • 如果是结构体指针变量,通过 -> 操作成功
#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};int main() {// 定义结构体变量,同时初始化struct stu s = {"mike", 18};// 打印成员变量printf("%s, %d\n", s.name, (&s)->age);// 修改成功变量的内容strcpy(s.name, "yoyo");s.age = 19;// 打印成员变量printf("%s, %d\n", s.name, (&s)->age);return 0;
}

4.结构体做函数参数

结构体值传参:传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

示例代码:

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};// 函数定义
void func(struct stu temp) {strcpy(temp.name, "yoyo");temp.age = 20;printf("函数内部:%s, %d\n", temp.name, temp.age);
}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,值传递func(s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);return 0;
}

运行结果:

函数内部:yoyo, 20
函数外部:mike, 18

5.结构体地址传递

传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};// 函数定义
void func(struct stu *p) {strcpy(p->name, "yoyo");p->age = 20;printf("函数内部:%s, %d\n", p->name, p->age);
}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,地址传递func(&s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);return 0;
}

运行结果:

函数内部:yoyo, 20
函数外部:yoyo, 20

二、共用体(联合体)

1.共用体的语法

  • 共用体union是一个能在同一个存储空间存储不同类型数据的类型
  • 共用体所占的内存长度等于其最长成员的长度,也有叫做共用体
  • 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用
  • 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖
  • 共用体变量的地址和它的各成员的地址都是同一地址

示例代码:

#include <stdio.h>// 共用体也叫联合体
union Test {unsigned char a;unsigned int b;unsigned short c;
};int main() {// 定义共用体变量union Test tmp;// 1、所有成员的首地址是一样的printf("%p, %p, %p\n", &(tmp.a), &(tmp.b), &(tmp.c));// 2、共用体大小为最大成员类型的大小printf("%llu\n", sizeof(union Test));// 3、一个成员赋值,会影响另外的成员tmp.b = 0x44332211;printf("%x\n", tmp.a); // 11printf("%x\n", tmp.c); // 2211tmp.a = 0x00;printf("short: %x\n", tmp.c); // 2200printf("int: %x\n", tmp.b);   // 44332200return 0;
}

运行结果:

000000b7b47ffc2c, 000000b7b47ffc2c, 000000b7b47ffc2c
4
11
2211
short: 2200
int: 44332200

2.共用体和结构体区别

  • 存储方式:
    • 结构体:结构体中的每个成员都占据独立的内存空间,成员之间按照定义的顺序依次存储
    • 共用体:共用体中的所有成员共享同一块内存空间,不同成员可以存储在同一个地址上
  • 内存占用:
    • 结构体:结构体的内存占用是成员变量占用空间之和,每个成员变量都有自己的内存地址
    • 共用体:共用体的内存占用是最大成员变量所占用的空间大小,不同成员变量共享同一块内存地址

三、枚举

概念:

枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内

语法格式:

enum  枚举名 {枚举值表
};
  1. 在枚举值表中应列出所有可用值,也称为枚举元素
  2. 枚举值是常量,不能在程序中用赋值语句再对它赋值
  3. 枚举元素本身由系统定义了一个表示序号的数值从0开始顺序定义为0,1,2
#include <stdio.h>enum weekday {sun = 2, mon, tue, wed, thu, fri, sat
} ;enum bool {flase, true
};int main() {enum weekday a, b, c;a = sun;b = mon;c = tue;printf("%d,%d,%d\n", a, b, c);enum bool flag;flag = true;if (flag == true) {printf("flag为真\n");}return 0;
}

四、typedef

概念:typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。

#include <stdio.h>// 类型起别名
typedef int INT;
typedef char BYTE;
typedef BYTE T_BYTE;
typedef unsigned char UBYTE;// struct type 起别名 
// TYPE为普通结构体类型,PTYPE为结构体指针类型
typedef struct type {UBYTE a;INT b;T_BYTE c;
} TYPE, *PTYPE;int main() {TYPE t;t.a = 254;t.b = 10;t.c = 'c';PTYPE p = &t;printf("%u, %d, %c\n", p->a, p->b, p->c);return 0;
}

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

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

相关文章

低噪声放大器是如何实现低噪声放大的功能的

灵敏度作为接收机最重要的指标之一,直接决定了接收机能分辨的最小信号。接收机的灵敏度计算公式如下所示。 Psensitivity=-174dBm+NF+10*lg(BW)+SNR 由接收机灵敏度的计算公式可知,影响接收机灵敏度的指标有噪声系数、带宽和信噪比,因此一旦带宽和信噪比确定了,那么能决…

Java设计模式——代理模式

静态代理&#xff1a; Java静态代理是设计模式中的一种&#xff0c;它通过创建一个代理类来代替原始类&#xff0c;从而提供额外的功能或控制原始类的访问。 如何使用Java静态代理 要创建一个静态代理&#xff0c;你需要有一个接口&#xff0c;一个实现该接口的目标类&#…

民航电子数据库:[E14024]事务内变更操作次数超过最大许可值10000,可通过系统参数max_trans_modify适当调整限制

目录 一、场景二、异常情况三、原因四、排查五、解决 一、场景 1、对接民航电子数据 2、执行delete语句时报错 二、异常情况 三、原因 通过报错信息就可以看出&#xff0c;是系统参数max_trans_modify配置导致 当删除的数据量 > max_trans_modify时&#xff0c;删除就会…

HarmonyOS开发实例:【分布式手写板】

介绍 本篇Codelab使用设备管理及分布式键值数据库能力&#xff0c;实现多设备之间手写板应用拉起及同步书写内容的功能。操作流程&#xff1a; 设备连接同一无线网络&#xff0c;安装分布式手写板应用。进入应用&#xff0c;点击允许使用多设备协同&#xff0c;点击主页上查询…

JVM之方法区的详细解析

方法区 方法区&#xff1a;是各个线程共享的内存区域&#xff0c;用于存储已被虚拟机加载的类信息、常量、即时编译器编译后的代码等数据&#xff0c;虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分&#xff0c;但是也叫 Non-Heap&#xff08;非堆&#xff09; 设置方法…

写一个简单的二叉树,简单增加节点和循环的算法

二叉树(Binary Tree)是树的一种常见形式。二叉树的任意结点最多可以有两个子结点&#xff0c;也可以只有一个或者没有子结点。因此二叉树的度数一定小于等于2。二叉树结点的两个子结点&#xff0c;一个被称为左子结点&#xff0c;一个被称为右子结点。二叉树严格区分左右子结点…

Latex学习(从入门到入土)3

第一章&#xff1a;排版矩阵 在LaTeX中&#xff0c;排版矩阵可以使用amsmath宏包提供的几种不同环境来实现。以下是一些常用的环境和它们的使用方式&#xff1a; ### 使用matrix环境 matrix环境是最基础的矩阵环境&#xff0c;它创建一个带有边框的矩阵&#xff0c;元素默认…

精益思维驱动人工智能革新:理论到实践的跃迁之旅

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已成为引领未来的关键力量。在这个变革的时代&#xff0c;如何将精益思维与人工智能相结合&#xff0c;推动AI从理论走向实践&#xff0c;成为行业内外关注的焦点。本文&#xff0c;天行健精益生产顾问将分享…

Macbook M1 Pro使用brew安装Docker并安装Nacos【超详细图解】

目录 一、安装 Docker 二、修改 Docker 镜像地址 三、拉取镜像-举例 Nacos 1.拉取镜像 2.查看本地镜像 3.删除镜像 四、启动容器 1.启动 Nacos 容器&#xff1a; I.方式一【推荐】 II.方式二【懒人推荐】 2.访问 Nacos Web 控制台 3.进入容器和退出容器 五、配置…

【算法基础3】并查集

并查集 现在我们要完成两个操作&#xff1a; 1.将两个集合合并 2.询问两个元素是否在一个集合当中 这两个操作的时间复杂度均为O(n)&#xff0c;但我们使用并查集的话&#xff0c;可以在近乎O(1)的时间内完成这一操作。 基本原理&#xff1a;每个集合用一棵树来表示&#xff0…

麻将的玩法及技巧

麻将是一种古老而受欢迎的博弈游戏&#xff0c;其玩法和技巧多种多样&#xff0c;因地区和玩家习惯的不同而有所差异。以下是一些通用的麻将玩法和技巧&#xff1a; 一、玩法 洗牌与码牌&#xff1a;玩家双手搓动牌&#xff0c;使牌均匀而无序地运动&#xff0c;称为“洗牌”。…

Hive:正则regexp_extract函数

语法: regexp_extract(string subject, string pattern, int index) 返回值: string 说明&#xff1a; 将字符串subject按照pattern正则表达式的规则拆分&#xff0c;返回index指定的字符。 第一参数&#xff1a; 要处理的字段 第二参数: 需要匹配的正则表达式 第三个参数: …

Java处理CSV类库:OpenCSV

一&#xff1a;CSV简介 Comma-Separated Values(CSV), 因分隔符没有严格指定规范标准&#xff0c;可以使用逗号&#xff0c;也可以使用其他字符&#xff08;如制表符\t、分号;等&#xff09;&#xff0c;所以CSV也称为 逗号分隔值或者字符分隔值。csv文件是使用纯文本来存储表…

【学习笔记】耳分解与无向图的双连通性

感觉之前对于这方面的理解还是不够深入。 1.1 1.1 1.1 在无向图 G ( V , E ) G(V,E) G(V,E)中&#xff0c;有一个子图 G ′ ( V ′ , E ′ ) G(V,E) G′(V′,E′)&#xff08;不一定是导出子图&#xff0c;其实只看 V ′ V V′就好了&#xff09;&#xff0c;若简单路径或简单…

R、Python的Copula变量相关性分析及AI大模型应用

在工程、水文和金融等各学科的研究中&#xff0c;总是会遇到很多变量&#xff0c;研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果&#xff0c;但这些系数都存在着无法克服的困难。例如&#xff0c;…

leetcode748-Shortest Completing Word

题目 给你一个字符串 licensePlate 和一个字符串数组 words &#xff0c;请你找出 words 中的 最短补全词 。 补全词 是一个包含 licensePlate 中所有字母的单词。忽略 licensePlate 中的 数字和空格 。不区分大小写。如果某个字母在 licensePlate 中出现不止一次&#xff0c…

MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理

说明&#xff1a;本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时&#xff0c;总是出错的背景下&#xff0c;不得已搜索和整理了一下&#xff0c;如何用命令行进行sql server 数据库和用户管理的方法&#xff0c;作为从Access2019 直接导出数据到sql server 数据库…

linux限权

shell命令以及运行原理 什么是shell命令&#xff1a; 将使用者的命令翻译给核心&#xff08;kernel&#xff09;处理。同时&#xff0c;将核心的处理结果翻译给使用者。 shell就相当于操作系统外的一层外壳 其实就是登录linux时的一个可执行程序&#xff08;进程&#xff09…

滴滴春招深度揭秘:2024最全Spring Microservices Architecture面试题大全,每位开发者必备!99%的应聘者都强烈推荐!

在2024年&#xff0c;随着技术的不断演进和市场需求的快速变化&#xff0c;微服务架构已经成为现代软件开发的核心。滴滴作为领先的科技公司之一&#xff0c;特别重视在其庞大的交通网络服务平台中采用微服务架构&#xff0c;以提高系统的可扩展性、灵活性和维护性。微服务架构…

安装kali虚拟机

第一步&#xff1a;安装vmware 安装到最后&#xff0c;会提示输入序列号 安装成功后的图标 第二步&#xff1a;创建一个虚拟主机 创建了一个虚拟机 第三步&#xff1a;给虚拟机安装系统 安装系统&#xff0c;都必须有 系统镜像文件 一般系统镜像文件的后缀是 .iso 第一步&a…