小杰学C(eleven day)——莫道浮云终蔽日,总有云开雾散时。

1.结构体

(1)内容

定义:

1.用户自定义的数据类型

2.可以包含若干不同数据类型可相同)的成员变量

3.这些数据项组合起来反应某一信息

格式:

struct 结构体名 (用户自定义的数据类型)

{

        数据类型 成员变量1;

        数据类型 成员变量2;

        数据类型 成员变量3;

        ...

};

(2)结构体变量

(结构体类型定义的变量)

格式:

struct 结构体 变量名

定义方式:

①先定义结构体类型,再定义其变量

struct 结构体名

{

        成员变量;

};

struct 结构体名 变量名;

②定义结构体同时,定义结构体变量

③缺省结构体名定义结构体变量

(3)赋值

① 定义变量的同时直接大括号赋值 (初始化)

②定义变量时未初始化,然后对成员变量单独赋值

③点等法赋值

(4)访问

通过 .访问:结构体变量名.成员变量名

scanf("%s %d %d %d", stu.name, &stu.id, &stu.score, &stu.age);

printf("%s %d %d %d\n", stu.name, stu.id, stu.score, stu.age);

(5)重定义 typedef

对变量进行重命名

typedef int int _num;

int == int_num

int a; == int_num a;

对指针地址进行重命名

typedef int * int _p

int * == int_p

int *p = &a; == int _p p = &a;

① 定义结构体的同时重定义

typedef struct student

{

        int id;

        int score;

} STU; // STU是结构体类型重定义的名字

struct student stu; == STU stu;

② 先定义结构体,然后重定义

struct student

{

        int id;

        int age;

};

typedef struct student STU;

2.结构体数组

(结构体相类型变量组成的数组)

(1)格式

① 定义结构体的同时定义结构体数组

②先定义结构体,然后定义结构体数组

struct student
{char name[32];int id;int score;int age;
};struct student stu[3];

(2)赋值:

        ① 定义结构体数组的同时赋值

        ②先定义结构体数组。再对结构体数组的每一个人元素分别赋值

(3)结构体数组的输入输出:(for循环遍历)

#include <stdio.h>
#include <string.h>struct student
{char name[32];int id;int score;int age;
};int main(int argc, char const *argv[])
{struct student stu[3];for(int i = 0; i < 3; i++){scanf() \ printf();}return 0;
}

(4)结构体数组的大小

        sizeof(结构体数组名);

        元素个数 * 结构体类型大小

3.结构体指针

(指向结构体的指针)

(1)格式:

        存储类型 数据类型 *指针变量名

        struct 结构体名 *结构体指针变量名

(2)赋值:

        格式:结构体指针变量 -> 成员变量

        -> 指向的

#include <stdio.h>
#include <string.h>struct student
{int id;int age;
} stu;struct work
{int id;int score;
} w;int main(int argc, char const *argv[])
{struct student *p1 = &stu;
    p1->id = 1;
    p1->age = 18;printf("%d %d\n", stu.id, stu.age);return 0;
}

(*p1).成员变量

练习:

        创建一个结构体数组,数组名为student,成员包含学号,姓名,成绩(数据类型自己设定)从终端输入学生信息,封装函数实现按成绩从低到高打印学生信息。

#include <stdio.h>
#include <string.h>#define N 3struct student
{int id;char name[32];int score;
};void fun(struct student *p)
{struct student temp;for(int i = 0; i < N-1; i++){for(int j = 0; j < N-1-i; j++){if((p+j)->score > (p+j+1)->score){
                temp = *(p+j);*(p+j) = *(p+j+1);*(p+j+1) = temp;}// if(p[j].score > p[j+1].score)// {//     temp = p[j];//     p[j] = p[j+1];//     p[j+1] = temp;// }}}for(int i = 0; i < N; i++)//printf("%d %s %d\n", p[i].id, p[i].name, p[i].score);printf("%d %s %d\n", (p+i)->id, (p+i)->name, (p+i)->score);
}int main(int argc, char const *argv[])
{struct student stu[N];for (int i = 0; i < N; i++)scanf("%d %s %d", &stu[i].id, stu[i].name, &stu[i].score);fun(stu);return 0;
}

(2)结构体大小

sizeof(struct 结构体名) // 结构体类型大小

struct student
{char a;short w;char y;int b;char c;
} stu;

结构体大小遵循字节对齐原则

        1.字节对齐:

在实际使用中,访问特定数据类型变量时需要在特定的内存起始地址进行访问,这就需要各种数据类型按照一定的规则在空间上进行排列,而不是顺序地一个接一个地存放,这就是字节对齐

        2.字节对齐原则:

  1. 在64位系统下默认的value值为8字节,判断结构体类型中最大成员变量的字节大小,和默认的value值进行比较,按小的数进行对齐
  2. 结构体成员进行对齐时遵循地址偏移量是成员类型的整数倍
  3. 结构体成员按顺序进行存储,如果不满足以上条件时,需要填充空字节

        3.进行字节对齐的原因:

  1. 平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。(提高程序的移植性)
  2. 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
  3. 内存原因:在设计结构体时,通过对齐规则尽可能优化结构体的空间大小至最小空间

例子:

struct student
{char a;short w;char y;int b;char c;
} stu;  // 大小 16

第一步:找出成员变量的大小,让其与编译器的默认的对齐数进行比较,取较小的值作为该成员变量的对齐数

第二步:根据每个成员对应的对齐数画出他们在内存中的相对位置

第三步:计算结构体大小

4.枚举

维基百科的理解:枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

我的理解:枚举类型就是将一些比较固定的值一一列举出来,枚举类型和宏定义是差不多的,只有细微区别,宏运行是在预处理阶段完成的,枚举类型是在与编译阶段完成的。

定义:

用户自定义数据类型,用于声明一组常数

格式:

enum 枚举名

{

        value1,

        value2,

        value3

        ...

};

未赋初值时,第一个常数默认是0,后续的常数依次加一(如果第一个值赋值为1,从赋值的1开始递增)

#include <stdio.h>
#include <string.h>
enum week
{
    MON = 1,
    TUE,
    WED,
    Thurs,
    Fri
};
int main(int argc, char const *argv[])
{int day;scanf("%d", &day);switch (day){case MON: printf("Monday"); break;case TUE:printf("Tuesday"); break;case WED:printf("Wednesday"); break;case Thurs:printf("Thursday"); break;case Fri:printf("Friday"); break;default:break;}return 0;
}

5.共用体

不同类型的成员变量共用同一块地址空间

格式:

union 共用体名

{

        成员列表;

}

(1)定义共用体变量

union 共用体名 变量名;

#include <stdio.h>
#include <string.h>union val
{int a;char ch;
} v;int main(int argc, char const *argv[])
{
    v.a = 10;// 他俩不能同时出现,是以最后一次赋值为准
    v.ch = 'a';printf("%d\n", v.a);return 0;
}

(2)特性:

  1. 共用体成员共用同一块地址空间
  2. 赋值顺序以最后一次为准
  3. 共用体大小为成员中类型最大的数据的大小

(3)使用共用体测试大小端

#include <stdio.h>
#include <string.h>union val
{int num;char ch;
} v;int main(int argc, char const *argv[])
{
    v.num = 0x12345678;if(v.ch == 0x78){printf("小端\n");}else{printf("大端\n");}return 0;
}

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

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

相关文章

海豚远程控制APP:随时随地,轻松掌控手机

在快节奏的现代生活中&#xff0c;我们常常需要在不同设备之间切换&#xff0c;管理手机也变得越来越重要。无论是远程办公、远程学习还是日常生活中对手机的管理&#xff0c;一款高效、便捷的远程控制软件都能极大地提升我们的效率。海豚远程控制APP正是这样一款功能强大的手机…

Linux/Ubuntu安装go

Linux/Ubuntu安装go1. 首先移除旧版本&#xff08;如有&#xff09;&#xff1a;2. 下载Go 1.23.9安装包&#xff1a;3. 解压到系统目录&#xff1a;4. 设置环境变量&#xff08;添加到~/.profile或~/.bashrc文件末尾&#xff09;&#xff1a;5.使环境变量生效&#xff1a;6. 验…

教程:如何快速查询 A 股实时 K线和5档盘口

实时行情数据是量化交易策略、看板系统和交易决策系统的重要输入。本文将以 Infoway API 提供的 WebSocket API 为例&#xff0c;教你如何使用 Python 快速接入并获取 A 股的实时 K线数据 和 盘口数据。一、准备工作安装 WebSocket 库&#xff1a;pip install websockets二、查…

施易德门店管理系统应用案例分析:零售女装品牌伊芙丽的全球化布局

在零售品牌的全球化进程中&#xff0c;如何应对不同市场的合规要求、实现本地化精细化运营&#xff0c;是企业面临的重要课题。施易德&#xff08;Cegid&#xff09;门店管理系统凭借40年的全球零售数字化服务经验&#xff0c;为多个品牌的海外拓展提供了支持。其中&#xff0c…

安全初级作业2

一、作业要求 1、xss-labs 1~8关 2、python实现自动化sql布尔育注代码优化(二分查找) 二、操作过程 &#xff08;一&#xff09;xss-labs 1~8关 1、前期准备 &#xff08;1&#xff09;打开小皮面板&#xff0c;并启动Apache和MySQL &#xff08;2&#xff09;将 xss-labs…

多模态大语言模型arxiv论文略读(157)

Automatic Evaluation for Text-to-image Generation: Task-decomposed Framework, Distilled Training, and Meta-evaluation Benchmark ➡️ 论文标题&#xff1a;Automatic Evaluation for Text-to-image Generation: Task-decomposed Framework, Distilled Training, and M…

面试150——数组字符串

88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。倒序比较&#xff0c;避免覆…

深入理解设计模式:命令模式详解

在软件开发中&#xff0c;我们经常遇到需要将"请求"或"操作"封装成对象的情况。比如&#xff0c;GUI中的按钮点击、遥控器控制家电、事务系统中的操作回滚等场景。命令模式&#xff08;Command Pattern&#xff09;正是为解决这类问题而生的设计模式。本文…

自己写的 MyHttpServlet 和直接继承 HttpServlet 的区别

继承你自己写的 MyHttpServlet 和直接继承 HttpServlet 的区别如下&#xff1a;1. 继承 HttpServlet&#xff08;官方推荐用法&#xff09;HttpServlet 是 Java EE 官方提供的 Servlet 基类&#xff0c;已经实现了 Servlet 接口的大部分方法。它内部已经实现了 service() 方法&…

python库 maya 库的各种案例的使用详解(人性化的日期时间处理)

文章目录 一、Maya库概述 1.1 maya介绍 1.2 安装 maya 1.3 注意事项 二、基本使用 2.1 创建 MayaDT 对象 2.2 格式化输出 2.3 时间运算 三、高级使用 3.1 时区处理 3.2 时间间隔 3.3 网络时间获取 四、实际应用示例 4.1 日志时间处理 4.2 会议时间提醒 4.3 国际化时间显示 5. M…

企业选择大带宽服务器租用的原因有哪些?

大带宽服务器作为各个行业使用较多的服务器类型&#xff0c;可以为企业提供更高的数据传输速率&#xff0c;极大缩短文件上传与下载时间&#xff0c;对于大型文件&#xff0c;大带宽服务器能够将时间大幅缩减至数分钟或数小时&#xff0c;提高企业整体的工作效率。大带宽服务器…

使用canal同步分库分表数据,到 Elasticsearch

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 本文的宗旨在于通过简单干净实践的方式教会读者&#xff0c;配置出一套 Canal 工具服务&#xff0c;来同步分库分表的数据到 Elasticsearch 文件夹系统中。同时在 SpringBoot 工程中&a…

气候为何愈演愈“炙” — 未来五年高温趋势与 AI 气象大模型的突破性价值

早、更准 代表性模型 主要特征 应用进展 GraphCast(DeepMind) 10 天全球预报;0.25 分辨率;< 1 min 推理 90 % 指标超 ECMWF HRES,已用于极端风暴提前锁定Google DeepMind MetNet-3(Google Research) 1–4 km 分辨率;2 min 时序;24 h 区域精细预报 美东、欧洲已在 G…

LVS四种模式及部署NAT、DR模式集群

1、lvs简介LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里四层SLB(ServerLoadBalance)是基于LVSkeepalived实现LVS 官网: http://www.linuxvirtualserver.org/LVS 相关术语VS: Virtual Server&#xff0c;负责调度RS:…

【Linux】Ubuntu22.04安装zabbix

官方文档&#xff1a;zabbix安装文档 环境如下 环境版本nginx1.26.3zabbix7.0.16mysql8.0.41 安装nginx和mysql 一键部署脚本 部署zabbix #!/bin/bash wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0ubuntu22.04_…

C++ - 仿 RabbitMQ 实现消息队列--sqlite与gtest快速上手

目录 SQLite 什么是 SQLite 为什么要用 SQLite SQLite3 C/C API 介绍 SQLite3 C/C API 使用 GTest GTest 是什么 GTest 使用 TEST 宏 断言 事件机制 全局事件 TestSuite 事件 SQLite 什么是 SQLite SQLite 是一个进程内的轻量级数据库&#xff0c;它实现了自给自足…

Web3.0 学习方案

Web3.0 学习方案 一、学习方案 &#xff08;一&#xff09;入门阶段 1. 了解 Web3.0 基础概念 学习内容&#xff1a; Web3.0 的起源、愿景、与 Web2.0 的区别区块链的基本概念&#xff1a;分布式账本、哈希、公钥/私钥、共识机制&#xff08;PoW、PoS、DPoS、PBFT 等&#xff0…

springboot3.5.3依赖学习

springboot3.5.3依赖学习 ​ Spring Boot BOM&#xff08;spring-boot-dependencies&#xff09;是 Spring 官方维护的超级依赖清单&#xff0c;覆盖了 Spring 生态中几乎所有核心库、常用工具库及第三方依赖。其作用是统一管理这些依赖的版本&#xff0c;确保它们相互兼容。以…

制作一款打飞机游戏80:道具碰撞

目前我们仍然无法拾取这些物品&#xff0c;它们只是简单地掉落在地上。因此&#xff0c;我们需要对这些功能进行增强。目标‌弹射物品‌&#xff1a;当物品生成时&#xff0c;我们希望它们能以一定的力量弹出&#xff0c;而不是无力地掉落。‌添加不同类型的物品‌&#xff1a;…

Python编程基础(六)| 用户输入和while循环

引言 很久没有写 Python 了&#xff0c;有一点生疏。这是学习《Python 编程&#xff1a;从入门到实践&#xff08;第3版&#xff09;》的课后练习记录&#xff0c;主要目的是快速回顾基础知识。 练习1&#xff1a;汽车租赁 编写一个程序&#xff0c;询问用户要租什么样的汽车&a…