当前位置: 首页 > news >正文

C语言——构造(结构体)

指针——内存操作

我们对于内存的操作借助于 <string.h>这个库提供的内存操作函数。

内存填充

头文件:

#include<string.h>

函数原型:

void*memset(void *s,int c,size_t n);

函数功能:

填充s开始的堆内存空间前n个字节,使得每个字节值为c

函数参数:
        void*s:待操作内存首地址。
        intc:填充的字节数据。
        size_tn:填充的字节数。

返回值:        返回s
注意:

c常常设置为0,用于动态内存初始化

内存拷贝

头文件:

#include <string.h>

函数原型:

                void *memcpy(void *dest,const void *src,size_t n);适合目标地址与源地址内存无重叠的情况。
                void *memmove(void *dest,const void *src,size_t n);

函数功能:

拷贝src开始的堆内存空间前n个字节,到dest对应的内存中。
函数参数:
        void *desk:目标内存首地址。
        void *src:源内存首地址。
        size_t n:拷贝的字节数。

返回值:

        返回dest
注意:内存中请了几个内存空间,就访问几个内存空问,否则数据不安全。

注意:memcpy与memmove一般情况下是一样的,更建议使用memmove进行内存拷贝;

因为memmove函数是自适应(从后往前或者从前往后)拷贝,当被拷贝的内存和目的地的内存有重叠时,数据不会出现拷贝错误。而memcpy函数是从前往后拷贝,当被拷贝的内存和目的地内存有重叠时,数据会出现拷贝错误。

内存比较

头文件:

#include <string.h>
函数原型:

int memcmp(void *dest,const void *src,size_t n)
函数功能:

比较src和dest所代表的内存前n个字节的数据;
函数参数:
        void *dest;目标内存首地址
        const void* src;源内存首地址
        size_tn;比较的字节数

返回值:
0:数据相同
>0:dest中的数据大于src

<0:dest中的数据小于src

注意:

n一般和src,dest的总容量一样;如果不一样,内存比较的结果就不确定了。

内存查找

头文件:

#include <string.h>

函数原型:

int *memchr |*memrchr(const void *s,int c,size_t n)

函数功能:

在s开始的堆内存空间前n个字节中查找字节数据c

函数参数:

        const void *s:待操作内存首地址;

        int c:待查找的字节数据

        size_t n:查找的字节数

返回值:

返回查找到的字节数据地址

注意:

如果内存中没有重复数据,memchr和memrchr结果是一样的;如果内存中有重复数据,memchr和memrchr结果就不一样;

构造类型

数据类型分类

1.基本类型

        整数型

                短整型:  short(2个字节)

                整型(默认):int(4个字节)  

                长整型 : long(8个字节)

                长长整型 : longlong

        浮点型

                单精度:float(4个字节)

                双精度:double(8个字节)

              字符型:char(1个字节)

2.指针类型

        数据类型*:int*,char*,float*等

        void*:任意数据类型的指针

3.空类型

        void:没有返回值或没有形参(不能定义变量)

4.自定义类型/构造类型

        结构体类型:struct

        共用体类型(联合体):union

        枚举类型:enum

注意:整数型和字符型分有符号signed和无符号unsigned,默认是有符号,有符号可以省略关键字signed

结构体

定义:

自定义数据类型的一种,关键字struct,结构体类型的变量可以存储多个不同数据类型的数据

定义格式:

struct 结构体名
{数据类型1  成员名称1;数据类型2  成员名称2;...
}

注意:

结构体中定义的变量,我们称之为成员变量。

格式说明:

        结构体名:合法的标识符,建议单词的首字母大写

        数据类型n:C语言支持的所有类型

        成员名称:合法的标识符,就是变量的命名标准

        数据类型n   成员名称n:类似于定义变量,定义了结构体中的成员

注意:

        结构体在定义的时候,成员不能赋值

常见的定义格式:

        方式1:常规定义(只定义类型) ---推荐

struct Student
{int num;//学号char name[20];//姓名char sex;// 性别int age;// 年龄char address[100];//家庭住址
}

        方式2:定义匿名结构体(常用于作为其他结构体的成员使用)

struct Dog
{char *name;// 姓名int age;// 年龄struct{ int year;//年int month;//月int day;// 日}birthdays;
}

注意:

定义匿名结构体的同时必须定义结构体变量,否则编译报错,结构体可以作为另一个结构体的成员

总结:

        1>结构体可以定义在局部位置,也可以定义在全局位置:

        2>全局位置的结构体名和局部位置的结构体名可以相同,就近原则(和普通变量的定义同理)

结构体类型的使用:

利用结构体类型定义变量,定义数组;结构体类型的使用与基本数据类型的使用类似。

结构体变量的定义

结构体变量也称为结构体的实力。

第一种

1)先定义结构体

2)然后使用struct 结构体名 变量名;

//先定义结构体(先定义结构体这个数据类型)
struct A
{int a;char b;
}// 定义结构体变量
struct A x;
struct A y;
第二种

在定义结构体的同时,定义结构体变量;

//先定义结构体(先定义结构体这个数据类型)
struct A
{int a;char b;
}x,y;

此时定义了一个结构体A,x和y是这个结构体类型的变量。

第三种:不推荐

在定义匿名结构体的同时,定义结构体变量;

struct
{int a;char b;
}x,y;struct
{int a;char b;
}z;

此时定义了一个没有名字的结构体(称为匿名结构体);y,x是这个匿名结构体类型的变量;

匿名结构体:---弊大于利(尽量少用)

        优点:少写一个结构体名称

        缺点:只能使用一次,定义的结构体类型的同时就必须定义变量。

        应用场景:

这里————————————

结构体变量的使用

结构体变量访问结构体成员
格式:       

结构体变量名,成员名;

可以通过访问给成员赋值(存数据)

可以通过访问获取成员的值(取数据)

结构体变量未初始化,结构体的成员值随机(不确定)

结构体变量在定义时,可以初始化
        建议用大括号标明数据的范围
        结构体成员初始化时,可以部分初始化,部分初始化时一定要带大括号标明数据的范围

结构体数组的定义

什么时候需要结构体数组?

比如:我们需要管理一个学生对象,只需要定义一个struct student majie;
假如:我们需要管理多个学生对象,此时就需要一个结构体的数组 struct student students[64];。

第一种:

先定义结构体类型,然后定义结构体变量,再将变量存储到结构体数组中

//定义一个学生类型的结构体
struct Student
{char *name;int age;float scores[3];// 三门课程的成绩
};// 定义结构体对象struct Student zhangsan ={"张三",23,{67.5,89.0,90.0}};struct Student lisi ={"李四",21,{77.0,80.0,85.0}};// 定义结构体数组struct Student student[3] = {zhangsan,lisi};
第二种:

定义结构体类型,然后定义结构体数组并初始化

// 定义一个学生类型的结构体
struct Student
{int id;char *name;int age;float scores[3];// 三门课程的成绩
};//定义结构体数组并初始化
struct Student students[3]={{1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致{2,"李四",21,{77.0,80.0,85.0}}
}
第三种:

定义结构体类型同时定义结构体数组并初始化

//定义一个学生类型的结构体
struct Student
{int id;char *name;int age;float scores[3];// 三门课程的成绩
}students[3]={{1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致{2,"李四",21,{77.0,80.0,85.0}}
};
第四种:

定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值

//定义一个学生类型的结构体
struct Student
{int id;char *name;int age;float scores[3];// 三门课程的成绩
} sts[3];sts[0].id = 1;
sts[0].name =“张三”:
sts[0].age = 12;
sts[0].scores[0]= 98;

小贴士:

结构体数组名访问结构体成员;

格式:结构体数组名 -> 成员名

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript 基础(四)
  • CentOS 7 上配置 NFS
  • 安卓应用开发学习:手机摇一摇功能应用尝试--摇骰子和摇红包
  • Qt解析XML
  • 力扣面试经典算法150题:删除有序数组中的重复项 II
  • Java - IDEA开发
  • MySQL中处理JSON数据:大数据分析的新方向,详解与示例
  • 17. 合并两个dataframe
  • 微电网控制器是什么?微电网中央控制器|微电网协调控制器|微电网控制系统图|Micon2505微网中央控制器方案介绍
  • 汽车免拆诊断案例 | 2013款北京现代悦动车发动机偶尔无法起动
  • adb查看当前运行的应用的包名和Activity(模拟器也可以)
  • C++适配windows和linux下网络编程TCP简单案例
  • 通过共享目录上传后门
  • 学习Flutter时需要了解的背景知识
  • 实现将docx转成PDF
  • CSS 三角实现
  • iOS 颜色设置看我就够了
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS笔记四:作用域、变量(函数)提升
  • MYSQL 的 IF 函数
  • PHP变量
  • ReactNativeweexDeviceOne对比
  • spring cloud gateway 源码解析(4)跨域问题处理
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Windows Containers 大冒险: 容器网络
  • 简单实现一个textarea自适应高度
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端攻城师
  • 浅谈web中前端模板引擎的使用
  • 入门到放弃node系列之Hello Word篇
  • 数据结构java版之冒泡排序及优化
  • 为视图添加丝滑的水波纹
  • postgresql行列转换函数
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • !!Dom4j 学习笔记
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #1015 : KMP算法
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)STL算法之遍历容器
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2015)JS ES6 必知的十个 特性
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (LeetCode) T14. Longest Common Prefix
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (vue)页面文件上传获取:action地址
  • (函数)颠倒字符串顺序(C语言)
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • *p++,*(p++),*++p,(*p)++区别?
  • .dwp和.webpart的区别
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net反混淆脱壳工具de4dot的使用
  • .NET技术成长路线架构图
  • .NET开发者必备的11款免费工具
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数