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。 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

ST-GCN模型实现花样滑冰动作分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

【07】Maven项目多环境打包配置

&#xff08;1&#xff09;Web项目使用Maven进行多模块划分开发之后&#xff0c;面临一个问题&#xff0c;即如何加载不同环境的配置文件打包发布到不同的环境中&#xff1f; &#xff08;2&#xff09;不同的环境有开发环境、测试环境、线上生产环境等。 &#xff08;3&#x…

【Unity Shader】Special Effects(十)Change 变换(UI)

源码:[点我获取源码] 索引 Change 变换思路分析变换进度噪声纹理闪烁闪烁时机闪烁颜色闪烁动画Change 变换 变换的效果为图像间的切换带来动感过程,使用动画播放器: 思路分析 首先,从原始图像变换到目标图像是一个从0到1的过程,这个过程我们命名为变换进度(0为完全显…

关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)

插件地址&#xff1a; Smash Balloon Social Photo Feed – Easy Social Feeds Plugin – WordPress 插件 | WordPress.org China 简体中文 安装后&#xff0c;配置教程&#xff1a; Setting up the Instagram Feed Pro WordPress Plugin - Smash Balloon 从这里面开始看就…

JavaScript的对象事件处理程序

一、对象的事件 对象的事件是指在一个对象上发生的特定动作或状态改变。对象可以是现实世界中的物体、概念、数据结构等。根据对象的类型和功能&#xff0c;可能会有不同类型的事件。 对象的事件一般由对象的方法或属性来处理和触发。通过定义对象的方法和属性&#xff0c;可…

Win11 CLion Qt开发探索

文章目录 一、Win11 CLion Qt需要的环境二、环境说明三、Win11 CLion Qt 开发步骤四、CLion Qt CMake脚本相关配置4.1 在CLion里如何使用资源文件.qrc4.2 Qt6 cmake如何添加ts翻译文件 五、程序打包 本篇博客介绍在Win11上使用CLion来编写Qt QWidget项目。 视频讲解&#xff1a…

Windows Server2012 R2搭建NFS服务器

正文共&#xff1a;1024 字 23 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在测试vCenter的集群操作时&#xff0c;出现了共享vSAN错误的问题&#xff0c;导致无法继续。我也只好先创建一个共享NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;存储…

信息安全工程师(77)常见网络安全应急事件场景与处理流程

前言 网络安全应急事件场景多样&#xff0c;处理流程也需根据具体情况灵活调整。以下将详述几种常见的网络安全应急事件场景及其处理流程。 一、数据泄露事件 场景描述&#xff1a; 数据泄露是指敏感、受保护或机密数据被未经授权的个人复制、传输、查看、窃取或使用。这种事件…

win10下MMSegmentation自定义数据集

下载1.2.1版本: Releases open-mmlab/mmsegmentation GitHub 安装环境 本地torch环境为1.9.1 pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0" 报mmcv版本不匹配的问题,形如:MMCV==X.X.X is used but incompatible. Please inst…

低代码解锁跨平台应用开发新境界

数字化转型中&#xff0c;企业面临应用开发挑战&#xff0c;低代码平台成为理想选择。ZohoCreator提供统一开发环境、拖拽设计、预置模板等&#xff0c;支持高效构建跨平台应用&#xff0c;确保数据安全与合规&#xff0c;助力企业数字化转型。 一、低代码平台是什么&#xff1…

yolov8涨点系列之C2f模块改进主分支

文章目录 C2F 模块介绍定义与基本原理应用场景 C2f模块修改步骤(1) C2f_up模块编辑(2)在__init_.pyblock.py中声明&#xff08;3&#xff09;在task.py中声明yolov8引入C2f_up模块yolov8.yamlyolov8.yaml引入C2f_up模块 C2f改进对YOLOv8检测具有多方面的好处 C2F 模块介绍 定义…

数据结构算法篇--递归(c语言版)

目录 1.递归 1.1求阶乘&#xff1a; 1.2.斐波那契数 1.3. 求幂 1.递归 在C语言中&#xff0c;递归是一种函数调用自身的方法&#xff0c;用来解决一些具有重复性质的问题。例如&#xff0c;计算阶乘、斐波那契数列等问题都可以通过递归实现。 递归在书写的时候&#xff0…

[大模型]视频生成-Sora简析

参考资料&#xff1a; Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密&#xff01;Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

【数据仓库】Hive 拉链表实践

背景 拉链表是一种数据模型&#xff0c;主要是针对数据仓库设计中表存储数据的方式而定义的&#xff1b;顾名思义&#xff0c;所谓拉链表&#xff0c;就是记录历史。记录一个事务从开始一直到当前状态的所有变化的信息。 拉链表可以避免按每一天存储所有记录造成的海量存储问题…

UnityAssetsBundle字体优化解决方案

Unity开发某个项目&#xff0c;打包后的apk包体已经高达1.25G了&#xff0c;这是非常离谱的。为了不影响用户体验&#xff0c;需要将apk包体缩小。因为项目本身不包含很多模型以及其他大型资源&#xff0c;排除法将AB包删除&#xff0c;发现app本身就100多M。 由此可以锁定是AB…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求&#xff1a; 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装&#xff1a; 1.设置软件源&#xff1a; 官方提供的软件源&#xff1a; sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

Qt多边形填充/不填充绘制

1 填充多边形绘制形式 void GraphicsPolygonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {Q_UNUSED(option);Q_UNUSED(widget);//painter->setPen(pen()); // 设置默认画笔//painter->setBrush(brush()); // 设置默…

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG 向量数据库是一种特殊类型的数据库&#xff0c;在人工智能应用中发挥着至关重要的作用。 在向量数据库中&#xff0c;查询与传统的关系数据库不同。它们不是进行精确匹配&#xff0c;而是执行相似性搜…