c语言简单编程练习10
1、typedef和#define的区别
在用作数据类型替换时的区别:
#include <stdio.h>
#include <unistd.h>typedef char * A; //typedef需要;
#define B char *int main(int argc, char *argv[])
{A a,b;B c,d;printf("a_size=%ld\n",sizeof(a));printf("b_size=%ld\n",sizeof(b));printf("c_size=%ld\n",sizeof(c));printf("d_size=%ld\n",sizeof(d));return 0;
}
运行结果:

在代码中我使用了两种方法去替换char *,在主函数中分别用这两种方式替换后的名字去定义char*类型的指针,我是64位操作系统,因此指针的大小为8,但是由结果可以看出d并不是一个指针;这里的区别就是typedef会把它当成一个整体的数据类型,但是#define只会替换,所以只有第一个字母c才定义为了指针。
区别总结:
- 处理阶段:
typedef是编译时指令。#define是预处理指令。
- 类型检查:
typedef定义的别名可以进行类型检查。#define只是简单的文本替换,不进行类型检查。
- 用途:
typedef主要用于定义类型别名。#define可以用于定义常量、函数宏或进行简单的文本替换。
- 作用域:
typedef的作用域与变量和函数的作用域类似,可以定义在文件级或块级。#define的作用域通常是文件级的,除非使用#undef显式取消定义。
2、结构体
任意数据类型(已知数据类型和构造类型)的成员集合,在空间地址上连续存储
结构体的本质:是一个数据类型
结构体的一般形式:
struct 结构体名{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3:;
......
};-------分号不能省略
结构体的大小:
1、计算机会给每个成员都开辟对应空间地址,64位默认以8byte对齐,但是如果最大成员的数据类型小于8byte,会以最大成员数据类型大小方式对齐,32位默认以4byte对齐,但是如果最大成员的数据类型小于4byte,会以最大成员数据类型大小方式对齐,最终结构体的大小一定为最大成员数据类型大小的倍数。
结构体指针:
指针的间接调用:
1、(*指针变量名).成员名 -----指针的用法
2、指针变量名->成员名 -----常用
#include <stdio.h>
#include <unistd.h>typedef struct demo{char name[32];int age;char sex[32];
}D,*p_D;int main(int argc, char *argv[])
{D a = {"xiaoming",120,"man"};D b = {"xiaohong",18,"woman"};p_D q = &a;struct demo *x = &b;printf("a.name=%s\n",a.name);printf("(*q).name=%s\n",a.name);printf("q->name=%s\n",a.name);printf("b.sex=%s\n",b.sex);printf("x->name=%s\n",x->sex);return 0;
}
解析:在上面代码中结构体指针有两种定义方法,一种是在定义结构体类型的时候,我的结构体重命名为D,结构体指针为*p_D;另一种就是直接用结构体类型来定义一个指针,struct demo *x=&b;
3、定义一个时间结构体,输入一个日期,输出该日期为该年的第几天
#include <stdio.h>
typedef struct time_day
{int year;int month;int day;
}T;
int main(int argc, char *argv[])
{T num;int i, sum=0;printf("请输入一个日期(2000.1.1):");scanf("%d.%d.%d",&num.year,&num.month,&num.day);int y[12]={31,28,31,30,31,30,31,31,30,31,30,31};for(i=0;i<num.month-1;i++){sum += y[i];}sum +=num.day;if(num.month>2 && num.year%4==0 && num.year%100!=0 || num.year%400==0){sum +=1;}printf("这一天是%d年的第%d天\n",num.year,sum);return 0;
}
解析:首先判断一个日期是该年的第几天我们需要做的事有:这个日期是第几个月,前面有几个月,要加多少天,还有就是该年是不是闰年,如果是闰年2月要多一天;除了闰年2月以外每个月的天数是固定的,因此我使用一个数组来存储每个月的天数;既然是用结构体那肯定要定义一个结构体,结构体里面放的是年月日,从键盘获取时间,得到之后判断月份为几月,因为数组元素是从0开始的,所以在循环求前几个月的天数和的时候循环条件就是输入的月份减去一,故循环条件为 i=0;i<num.month-1;i++;之后我们只需要判断年份是否为闰年(能被4整除但不能被100整除或能被400整除),是闰年且月份大于2月,就在总天数加上一天即可。运行结果如下:

4、定义一个结构体,包括学生的学号,姓名,性别和成绩四个部分,然后定义如下五个学生,根据他们的成绩从高到低进行排序
#ifndef _TEXT4_H
#define _TEXT4_H
#include <stdio.h>
typedef struct student
{int id;char name[32];char sex[32];int score;
}STU;
void my_score(STU *s);
#endif
#include "text4.h"
void my_score(STU *s)
{ int i,j;STU temp;for(i=0;i<4;i++){for(j=0;j<4-i;j++){if(s[j].score<s[j+1].score){temp = s[j];s[j] = s[j+1];s[j+1] = temp;}}}puts("学号 姓名 性别 成绩");for(i=0;i<5;i++){printf("%d %s %s %d\n",s[i].id,s[i].name,s[i].sex,s[i].score);}
}
#include "text4.h"
int main(int argc, char *argv[])
{STU a={2014123,"张三","男",67};STU b={2014456,"李四","女",92};STU c={2014789,"王五","男",74};STU d={2014999,"赵六","男",83};STU e={2014888,"小七","女",99};STU arr[5]={a,b,c,d,e};my_score(arr);return 0;
}
解析:这里也是对结构体的应用,首先是定义一个学生信息的结构体,然后是通过学生的成绩对他们进行排序,这里排序不是只排分数,而是对结构体进行排序,所以就需要用到结构体指针,除此之外需要操作每一个结构体就需要用结构体数组将结构体放到数组中,将这个数组当做参数传入到排序函数中进行排序;排完序直接在功能函数中输出即可。代码运行结果如下:

5、共用体(联合体)(union)
用法和结构体类似,但是没有初始化
共用体只会给最大成员开辟空间地址,所有成员都使用这一片空间地址,所以后面的成员赋值会覆盖前面成员赋值(前面成员一定会等于最后一次成员的赋值)
也要遵守结构体的大小字节对齐规则
优点:
-
内存效率:
共用体的最大优点在于其内存效率。由于共用体的所有成员共享同一块内存区域,因此它只占用其最大成员所需的内存空间。这对于内存资源有限的系统(如嵌入式系统)来说是一个巨大的优势,因为它允许程序员在不影响功能的前提下最大限度地减少内存占用。 -
类型灵活性:
共用体提供了在相同内存位置存储不同数据类型的能力。这意味着程序员可以根据需要在运行时动态地选择存储哪种类型的数据。这种灵活性在某些应用场景中非常有用,比如处理多态数据或在不同数据类型之间进行快速转换。 -
简化代码:
在某些情况下,使用共用体可以简化代码结构。例如,当处理具有多种可能表示的数据时(如错误码、状态码或特定于协议的字段),可以使用共用体来避免编写大量的条件语句(如if-else或switch-case)。通过直接访问共用体的成员,程序员可以更直接地处理数据,从而提高代码的可读性和可维护性。 -
硬件接口:
在嵌入式系统和低级编程中,共用体常用于与硬件接口进行交互。硬件寄存器通常映射到特定的内存地址,并且这些寄存器可能具有不同的数据类型(如整数、位字段或浮点数)。通过定义一个包含这些不同数据类型的共用体,程序员可以方便地访问和操作这些寄存器,而无需担心类型转换或内存对齐的问题。 -
数据封装:
虽然共用体本身不是一种封装机制,但它们可以用于在数据结构中封装不同类型的数据。这有助于将相关但不同类型的数据组合在一起,从而简化数据处理和传递的过程。
6、枚举型(enum)
1、里面的元素都是常量,都是连续自加一次
2、里面不赋初值就从0开始自加,赋了初值就从赋得初值开始自加,如果在中间的元素赋值,前面的从0开始自加,后面的从初值开始自加
3、不能在枚举型外面赋值
4、不能赋值浮点型的数据
5、大小为4byte,里面的元素都用同一片空间地址,但不会覆盖,只会自加1
#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[])
{enum y{a,b,c=10,d,e,f};printf("a=%d\n",a);printf("c=%d\n",c);printf("f=%d\n",f);return 0;
}
解析:从代码中可以看出,不赋初值就从0开始自加,a=0,b=1;从c赋了初值,c之后变量的值就为d=11,e=12,f=13。
相关文章:
c语言简单编程练习10
1、typedef和#define的区别 在用作数据类型替换时的区别: #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…...
时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多步时间序列预测
时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测 目录 时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多…...
数据结构[2016]
一、设有二维数组A[6][8],每个元素占6个字节存储,实现存放,A[0][0]的起始地址为1000,计算: (10分) (1)数组最后一个元素A[5][7]的起始地址; (2)按行优先存放时,元素A[1][4]的起始地址; (3)按列优先存放时…...
DBAPI连接阿里云 maxcompute 报错
使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar ,这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar,这个不是完整的,它还…...
Web3对社交媒体的影响:重新定义用户互动方式
随着互联网的发展和人们对隐私、安全、所有权的需求不断提高,Web3 的概念逐渐深入人心。Web3 的出现标志着一个去中心化、用户主导的网络时代的到来,这也将对社交媒体产生深远的影响。Web3 不仅推动社交媒体从中心化模式向用户主导的去中心化模式转变&am…...
【LeetCode】【算法】322. 零钱兑换
LeetCode 322. 零钱兑换 题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每…...
人工智能技术:未来生活的“魔法师”
想象一下,未来的某一天,你醒来时,智能助手已经为你准备好了早餐,你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐,而你的自动驾驶汽车已经在门口等你。这不是科幻小说,这是人工智能技术为我…...
docker加载目录中所有的镜像
docker加载目录中所有的镜像 首先我们知道读取单个命令如下: docker load -i example_image.tar.gz读取两三个也是: docker load -i image1.tar.gz image2.tar.gz image3.tar.gz但是如果是几十个,那么上面的命令就显得捉襟见肘了;比如当前我有个image…...
使用免费的飞书机器人,实现消息推送实时通知
大家好,我是小悟。 实际工作中,我们会经常遇到需要给用户发送业务通知的功能需求,如果是小程序端,那么就使用小程序提供的模板消息通知,如果是APP端,一般就是使用个推、极光等第三方平台。 当然还有个万能…...
各种网络设备的工作原理
网络设备的工作原理涉及多种设备,包括路由器、交换机、防火墙等,它们各自承担着不同的功能。以下是对这些设备工作原理的详细解释: 一、路由器路由器是互联网通信中的关键设备,它负责在不同网络之间传输数据包。功能:路…...
FilterListener组件
文章目录 Java Web三大组件一、Filter概述二、Filter开始1_过滤器API介绍2_过滤器开发步骤3_代码实现4_过滤器执行流程小结 三、使用细节1_生命周期2_拦截路径3_过滤器链 四、Listener1_Listener概述2_监听器举例3_Listener开始4_案例:模拟spring框架 Java Web三大组件 组件: 是…...
使用Ubuntu快速部署MinIO对象存储
想拥有自己的私有云存储,安全可靠又高效?MinIO是你的理想选择!这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO,并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手,也能轻松完成…...
基于Liquid State Machine的时间序列预测:利用储备池计算实现高效建模
Liquid State Machine (LSM) 是一种 脉冲神经网络 (Spiking Neural Network, SNN) ,在计算神经科学和机器学习领域中得到广泛应用,特别适用于处理 时变或动态数据。它是受大脑自然信息处理过程启发而提出的一种 脉冲神经网络 。 设想你正处于一片平静的湖面,四周环绕着高山,你向…...
oracle使用CTE递归分解字符串
oracle使用CTE递归分解字符串 背景 给定一个不定长度字符串 并且以,分割例如 ‘1,2,3,4’ 使用sql查询 返回1,2,3,4四行 如果‘1,2’ 则返回 1,2 两行 使用sql实现 实…...
华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力5-识别平面语义
对于检测到的平面,您可以通过AR Engine识别该平面的语义,包括墙面、地面、座椅面、桌面、天花板、门面、窗面、床面。 创建AR会话 创建AR会话并配置为平面语义识别模式。 AREngine_ARSession *arSession nullptr;// 创建AR会话。HMS_AREngine_ARSessi…...
MAC 安装 brew及其常用命令
文章:Mac安装brew的四种方法(指定能行) 以下是在 Mac 上使用 Homebrew 清理缓存和无用包的详细指南: 1. 查看系统状态 # 诊断系统问题 brew doctor# 查看已安装的包 brew list# 查看系统占用空间 brew cleanup -n # 预览需要…...
nVisual标签打印模块的部署与使用
部署 标签打印模块部署需要注意的是 前置条件 标签打印模块是以外部模块形式依附于nVisual主模块的,所以要先部署好nVisual主模块的前后端程序。 部署文件下载 标签打印模块也分前端文件和后端文件,从微盘->软件发布->nVisual official relea…...
python NLTK快速入门
目录 NLTK简介安装NLTK主要模块及用法 词汇与语料库分词与词性标注句法分析情感分析文本分类综合实例:简单的文本分析项目总结 1. NLTK简介 NLTK(Natural Language Toolkit)是一个强大的Python库,专门用于自然语言处理ÿ…...
技术速递|.NET 9 中 System.Text.Json 的新增功能
作者:Eirik Tsarpalis - 首席软件工程师 排版:Alan Wang System.Text.Json 的9.0 版本包含许多功能,主要侧重于 JSON 架构和智能应用程序支持。它还包括一些备受期待的增强功能,例如可空引用类型支持、自定义枚举成员名称、无序元…...
LLM 使用 Elastic 实现可观察性:Azure OpenAI (二)
作者:来自 Elastic Muthukumar Paramasivam•Lalit Satapathy 我们为 Azure OpenAI GA 包添加了更多功能,现在提供提示和响应监控、PTU 部署性能跟踪和计费洞察! 我们最近宣布了 Azure OpenAI 集成的 GA。你可以在我们之前的博客 LLM 可观察性…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
