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才定义为了指针。

区别总结: 

  1. 处理阶段
    • typedef 是编译时指令。
    • #define 是预处理指令。
  2. 类型检查
    • typedef 定义的别名可以进行类型检查。
    • #define 只是简单的文本替换,不进行类型检查。
  3. 用途
    • typedef 主要用于定义类型别名。
    • #define 可以用于定义常量、函数宏或进行简单的文本替换。
  4. 作用域
    • 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)

用法和结构体类似,但是没有初始化

共用体只会给最大成员开辟空间地址,所有成员都使用这一片空间地址,所以后面的成员赋值会覆盖前面成员赋值(前面成员一定会等于最后一次成员的赋值)

也要遵守结构体的大小字节对齐规则

优点:

  1. 内存效率
    共用体的最大优点在于其内存效率。由于共用体的所有成员共享同一块内存区域,因此它只占用其最大成员所需的内存空间。这对于内存资源有限的系统(如嵌入式系统)来说是一个巨大的优势,因为它允许程序员在不影响功能的前提下最大限度地减少内存占用。

  2. 类型灵活性
    共用体提供了在相同内存位置存储不同数据类型的能力。这意味着程序员可以根据需要在运行时动态地选择存储哪种类型的数据。这种灵活性在某些应用场景中非常有用,比如处理多态数据或在不同数据类型之间进行快速转换。

  3. 简化代码
    在某些情况下,使用共用体可以简化代码结构。例如,当处理具有多种可能表示的数据时(如错误码、状态码或特定于协议的字段),可以使用共用体来避免编写大量的条件语句(如if-else或switch-case)。通过直接访问共用体的成员,程序员可以更直接地处理数据,从而提高代码的可读性和可维护性。

  4. 硬件接口
    在嵌入式系统和低级编程中,共用体常用于与硬件接口进行交互。硬件寄存器通常映射到特定的内存地址,并且这些寄存器可能具有不同的数据类型(如整数、位字段或浮点数)。通过定义一个包含这些不同数据类型的共用体,程序员可以方便地访问和操作这些寄存器,而无需担心类型转换或内存对齐的问题。

  5. 数据封装
    虽然共用体本身不是一种封装机制,但它们可以用于在数据结构中封装不同类型的数据。这有助于将相关但不同类型的数据组合在一起,从而简化数据处理和传递的过程。

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。 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

题目讲解15 合并两个排序的链表

原题链接&#xff1a; 合并两个排序的链表_牛客题霸_牛客网 思路分析&#xff1a; 第一步&#xff1a;写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

【freertos】FreeRTOS任务管理

FreeRTOS任务管理 一、任务的创建和删除1、函数xTaskCreate2、函数xTaskCreateStatic3、函数xTaskCreateRestricted4、函数vTaskDelete 二、任务的挂起和恢复1、函数vTaskSuspend2、函数vTaskResume3、函数vTaskResumeFromISR4、函数vTaskSuspendAll5、函数xTaskResumeAll 三、…

FreeRTOS 20:互斥量(互斥信号量)操作

互斥信号量其实就是一个拥有优先级继承的二值信号量&#xff0c;在同步的应用中&#xff08;任务与任务或中断与任务之间的同步&#xff09;二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一把钥匙&#xff0c; 当任务想要访问共…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree&#xff1f;1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

肿瘤治疗评价指标太多?一文帮你梳理清楚!|个人观点·24-11-09

小罗碎碎念 如何延长癌症患者存活时间、提高生存质量、减轻肿瘤带来的痛苦&#xff0c;是评价抗癌药物的重要标准&#xff0c;而把这些标准落在数据上就诞生了各项“评价指标”。 在肿瘤治疗领域&#xff0c;有OS、PFS、RFS、TTP、TTF、ORR、DCR、DDC等各项评价指标。对于大部…

保研考研机试攻略:python笔记(3)

&#x1f428;&#x1f428;&#x1f428;11sort 与 sorted 区别 sort 是应用在 list 上的方法&#xff0c;sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作&#xff0c; 无返回值&#xff0c;而内建函数 sorted 方法返回的…

Linux之自定义shell和C标准库函数

自定义shell和C标准库函数 一.自定义xshell1.1main函数主体1.2获取用户信息以及命令串1.3判断命令串是否为空串1.4判断是否为重定向1.5分割命令串1.6判断是否为内建命令1.7执行命令 二.自定义C标准库函数2.1mystdio.h2.2mystdio.c2.3main.c 一.自定义xshell 1.1main函数主体 1…

TeamTalk知识点梳理一(单聊)

文章目录 db_proxy_serverdb_proxy_server reactor响应处理流程连接池redis连接池MySQL连接池 单聊消息消息如何封装&#xff1f;如何保证对端完整解析一帧消息&#xff1f;协议格式&#xff1f;单聊消息流转流程消息序号&#xff08;msg_id &#xff09;为什么使用redis生成&a…

带跳转功能的电子产品目录如何制作?

​在数字化时代&#xff0c;电子产品已成为我们生活和工作中不可或缺的伙伴。为了方便用户快速查找所需产品&#xff0c;带跳转功能的电子产品目录应运而生。本文将详细介绍如何制作一个高效便捷的带跳转功能电子产品目录&#xff0c;让用户轻松实现产品查找、筛选和购买。 1.要…

从0开始linux(26)——动静态库

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 如何写一个静态库动态库动静态链接 c/c程序形成可执行程序&#xff0c;需要经过三个步骤&#xff0c;编译、汇编、链接三个步骤&#xff0c;我们之前做链接时&#xff0c;使用的方法是将头文件…

hexo 搭建个人博客网站

hexo搭建个人博客 文章目录 hexo搭建个人博客摘要搭建网站的前置工具WebStormHexo Hexo配置初始化本地运行 主题更改安装butterfly主题 正式上线GitHub Pages配置新建仓库SSH密钥配置 将hexo部署到GitHub 个性化设置后续网站更新内容分类和标签设置分类&#xff08;categories&…

BLDC基础知识复习【二】

如果采用20毫欧的电流采样电阻&#xff0c;10A的电流计算出来时0.2V&#xff0c;这个显然还是太小了&#xff0c;需要运放放大并且加上偏置&#xff1a; 6组换向程序&#xff1a; 最核心的控制逻辑在这里&#xff1a;在main.c里面对PWM占空比进行设置&#xff0c;通过一个指针在…

1130 - Host ‘10.0.0.1‘ is not allowed to connect to this MySQL server

1130 - Host 10.0.0.1 is not allowed to connect to this MySQL server 一、1130 - Host 10.0.0.1 is not allowed to connect to this MySQL server二、1130 - Host 10.0.0.1 is not allowed to connect to this MariaDB serverendl 一、1130 - Host ‘10.0.0.1’ is not all…

构建智慧城市:数字孪生技术的发展之路

基于数字孪生的智慧城市发展是一种革命性的城市转型模式&#xff0c;旨在将物理世界与数字世界融合&#xff0c;在数字平台上建立城市的虚拟映像&#xff0c;从而实现对城市运行状态、资源利用、环境影响等方面的综合管理和优化。这种发展模式将数字技术深度融入城市规划、建设…

金融行业信息流投放方法论及金融客户投放案例

失血2024&#xff0c;金融行业进入“极寒”&#xff0c;广告投放也不例外。 受金融政策管控&#xff0c;在渠道投放受限也颇多&#xff0c;创意文案及素材上审核异常严格&#xff0c;整体投放成本高…… 金融理财信息流广告投放&#xff0c;如带着“镣铐”跳舞&#xff0c;束…

Unity-Yaml-Dot-Net诗歌篇-如何像雷总学习写代码像诗歌-MVC 框架,+注入Inject +状态机生命周期

我们是否可以像雷总一样 大家都说他的代码&#xff0c;像诗一样优雅 一个MVC 框架&#xff0c;加注入 &#xff08;以下内容其实和雷总没什么关系&#xff0c;也和雷总当年代码毫无关系&#xff0c;不过先“阅读理解”一下&#xff09; 雷总-写的代码像似一个优雅??!!^^ R…

安卓好软-----电脑端查看apk全部信息的工具 查看包名 名称以及权限等等

有时候从网络下载的应用很多是英文。时间久了会忘记到底是什么apk应用。这款工具可以方便的查看apk应用的名称 包名以及各种权限 图标 大小版本号等等。方便用户随时查看 APK Helper能够详细地获得安装包名、软件名称、APK证书、真实版本号、要求的手机版本、系统权限、以及证书…

分布式唯一ID生成(四):tinyid

文章目录 本系列前言号段模式多DB支持tinyid-client 本系列 漫谈分布式唯一ID分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf分布式唯一ID生成&#xff08;三&#xff09;&#xff1a;uid-generator分布式唯一ID生成&#xff08;四&#xff09;&#xff1a;tiny…

JavaWeb:文件上传2

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

April tag坐标定义

朝右的方向为x轴正向&#xff0c; 朝下的方向为y轴正方向&#xff0c; z 轴垂直纸面向里。 4个角点的坐标定义如下图所示。