c++之说_9|自定义类型 struct

今天我这里下雪了  很冷  你哪里呢?

我们  来谈谈 自定义类型

这只是一个称呼

包含有 结构体(struct)  类(class)  共用体(union) 

枚举(enum)

我们编程基本要常常与自定义类型 打交道

进行面向对象编程方式

自定义类型  有个比较重要的概念:

访问权限修饰符

private (私有) 

protected (血亲私有) 

public (公开)

 

private 私有 很好理解 

只能在自己的内部访问到

protected (血亲私有) 

应该叫继承链私有  只有子父类的内部有权限访问

public (公开)

公开不必说  在任何地方通过实例化的对象都可访问

 

说说 struct 结构体

语法规则

struct  name {  }  (可选)实例化对象名称;

它大括号内部可以装填  变量与函数 

struct a 

//默认访问权限修饰符为 public

   int b;

   int function(a* n){ return 0;};

 }

int main()

{

struct a  A;  //创建 struct a 类型的  A变量(对象)

a  A1;  //创建 struct a 类型的  A1变量(对象)

A1.b = 100;//给A1变量中的成员变量 b  赋值 100

std::cout  ‹‹ A1.b;//100

A1.function(nullptr);//这是A1中的成员函数调用 

a * pA1 = &A1;//& 取地址符 没忘吧? 初始化 a类型的指针变量

pA1  -›b;//100  通过指针变量pA1去访问成员b

 

*pA1.b;//这个也是指针访问成员b  不过与-›有区别

 

return 0;

}

上述 有几个  关键

一:

.     注意这个小点( 对象成员访问符 )  你想访问自定义类型 变量中的 成员 就得使用它

 

二:

-› 这是一个箭头  你想通过自定义类型的指针 变量  去访问 该地址的使用此类型解释时的对应成员 就得用它

 

三:

*  解引用 (我喜欢叫 解地址符  因为本质它就是拿到这个地址所代表的类型对应的变量) 

 

就如上述

*pA1  与  *pA1.b  意义是不同的 二者都有解释

*pA1  是 通过pA1中存储的地址 去 拿到该指针类型 对应的变量  

就是  我指针是 自定义类型的  拿到的这个变量就是自定义类型的   

是 基本数据类型的 拿到的变量就是  基本数据类型的

恩…我画个图个你们瞅瞅 理解理解

先设定一下 

比如

struct  B

{

int c;//四字节

int b;//四字节

}

sizeof(  B ) =  8  字节  没问题吧 

sizeof 关键字 可以计算类型 或  变量所需的大小

它编译期就可确定的 无法动态

现在我们要写下这个

 

B  object(100,200); //object.b = 100 object.c = 200   这是struct初始化的一种方法

 

B* pOBJ = &object;//初始化指针变量   将 object 的地址 存进 pOBJ中

 

int * pInt = (int*)pOBJ;//强制类型转换为int*  且将 pOBJ 中存储的值  初始化给 pInt

简单来说 pOBJ 中存的数值  与 pInt 中 是一致的

假如 pOBJ 中存储的值是

0x00000100  四字节的指针(32位下)

则 object 的内存分布如下

15b49034e037402ea88393a405d74341.jpg

 

97be0bc4922141f6ab51238fc94f7585.jpg

 a6b4fc86bae445b6a3d891dc6df6ded8.jpg

 用 *pOBJ  去访问  

拿到的内存块是

9f8ecd95a4504ed4b499b0c8dbbdbedb.jpg

 *pInt  拿到的内存块

b4a0ad29d913488b8e7ef70c7674386d.jpg

 我的理解是  首先

指针变量  里存的只是数值而已

而指针类型让计算机知道这数值代表的是地址

且使用用该地址时 应该的解释类型

就像上述  pOBJ  类型是 B* 

按照B类型去解释 0x00000100  

我们就去找到这个内存位置  然后向后数 8个内存块   (B类型大小为 8 字节  )   具体内部依然细分  直到 分为 简单的基本数据类型为止  

所以 *pInt 才会出现 在同一内存位置  只拿了前4个内存块   因为指针解释类型是 int 的  

而所谓的指针运算  其实也是差不多的概念

执行了 pInt++;

pInt 应该为几?  之前是  0x00000100

答案是 应该为   0x00000104

3500321d95f344599e523e0104cd93da.jpg

 如果是 pOBJ+1  是多少呢?

大家应该知道怎么推理了 

首先  看 pOBJ 中值  是多少  是 0x00000100

其次 看是什么类型的指针  B* 类型  

解释类型是 B   sizeof B  = 8

所以 运算结果是

0x00000100 + 8 = 0x00000108

想那些数组指针  也是如此运算的

char b[ 10 ] = { 0 };// 假定 &b = 0x00000000

char (*pb)[10] = &b;

pb + 1 = ?  

答案是  0x00000000+10=0x00000010

首先 先看pb内存的值是多少 0x00000000

其次看pb的指针类型 char (*)[10]

解释类型 char[10]

数组元素 是char  有 10个

计算  0x00000000 +  ( 1 * 10) =  0x00000010

sizeof  char  = 1

0x00000000 +  ( sizeof char   * 10) =  0x00000010

思索一下二维数组

char b2[ 10 ][5] = { 0 };// 假定 &b = 0x00000000

char (*pb2)[10][5] = &b2;

pb2 + 1 = ?  

 

0x00000000 + ( sizeof char * (10 * 5 )  ) = 0x00000050

我应该没弄错  你可以在编译器里 运行看看 输出的地址值  偏移是否是 50

所以类型很重要   在指针上面来说我们可以随意更改  指针变量中 地址 的解释类型

给你们说个例子

struct  B

{

int c;//四字节

int b;//四字节

}

struct  B2

{

short a;//二字节

short b;//二字节

int c;//四字节

}

// main 函数中

B  object(100,200); //object.c = 100 object.b= 200   这是struct初始化的一种方法

B* pOBJ = &object;//初始化指针变量   将 object 的地址 存进 pOBJ中

int * pInt = (int*)pOBJ;//强制类型转换为int*  且将 pOBJ 中存储的值  初始化给 pInt

B2* pb2 = (B2*)&objec;

pb2 -›a = 1; 

pb2 -›b = 1;

object.c 为多少

答案是  257

2bda438cbff846bc80dcc49e044ccc6b.jpg

 

 分析一下内存分布

B类型是这样的

09379fd5e5324ef085b57a7eed3efc0e.jpg

 而B2类型是这样的

64359783e204404f91950dad49c5fcf3.jpg

 我们看看最开始  

object.c = 100 时 

内存里面的数值(十六进制显示)

daef5c4f797847e0906554784b298b68.jpg

 054fd53c38bf4eef8e00499bc3bf80cf.jpg

 而 当地址被强转为 B2*时 且被修改

B2* pb2 = (B2*)&object;

pb2 -›a = 1; 

pb2 -›b = 1;

*pb2 同一块地址的 内存分布中数值是

b1aa0d55f8c642cb894f8e5cea05e092.jpg

 而此时  object.c  =  0x0101  (257)

未完待续…很晚了 明见

 

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

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

相关文章

Flink问题解决及性能调优-【Flink不同并行度引起sink2es报错问题】

最近需求,仅想提高sink2es的qps,所以仅调节了sink2es的并行度,但在调节不同算子并行度时遇到一些问题,找出问题的根本原因解决问题,并分析整理。 实例代码 --SET table.exec.state.ttl86400s; --24 hour,默认: 0 ms …

对比损失函数

多看大佬的文章,总结的太好了! 善于利用工具:researchrabbit 所以应该是contrastive metric learning

美,英,法,德、意大利和西班牙的geojson,以及区域json

美,英,法,德、意大利和西班牙的geojson文件 json地址 https://pan.baidu.com/s/1nio1bV_j-jAEVqgEHXWsNw?pwdqwer#list/path/GEOJSON 感谢大佬提供的 大佬连接 大佬的知乎原地址 国内geojson获取工具地址 http://da![在这里插入图片描述](h…

【大数据】流处理基础概念(二):时间语义(处理时间、事件时间、水位线)

流处理基础概念(一):Dataflow 编程基础、并行流处理流处理基础概念(二):时间语义(处理时间、事件时间、水位线)流处理基础概念(三):状态和一致性模…

【并发】什么是 Future?

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 关键特性和操作包括: 提交任务: 查询完成状态: 等待结果: 取消任务&#xff1a…

[linux] 域名解析失败案例定位 [Errno -2] Name or service not known

首先发现代码里这段运行报错: socket.gethostbyname_ex(host_name) Traceback (most recent call last): File “”, line 1, in socket.gaierror: [Errno -2] Name or service not known import socket host_name socket.gethostname() print(socket.gethostby…

搜索(3):双向BFS

对于一些问题我们使用普通BFS求解时,队列中最多会存在两层的搜索节点,搜索空间的上界取决于目标节点所在的搜索层次的深度所对应的宽度,一旦层数比较多,那可能会出现搜索爆炸的问题,双向BFS可以让我们不使用这么宽的搜…

Java Web(四)--JavaScript

介绍 JavaScript 教程 JavaScript 能改变 HTML 内容,能改变 HTML 属性,能改变 HTML 样式 (CSS),能完成页面的数据验证; JS 需要运行浏览器来解析执行JavaScript 代码; JS 是 Netscape 网景公司的产品&#xf…

HTML 炫酷进度条

下面是代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>Light Loader - CodePen</title><style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr…

1.25学习总结

今天学习了二叉树&#xff0c;了解了二叉树的创建和遍历的过程 今天所了解的遍历过程主要分为三种&#xff0c;前序中序和后序&#xff0c;都是DFS的想法 前序遍历&#xff1a;先输出在遍历左节点和右节点&#xff08;输出->左->右&#xff09; 中序遍历&#xff1a;先…

【mongoDB】下载与安装教程

目录 1. 下载 2.安装 3.启动 mangoDB是否启动成功 ? 1. 下载 官网地址&#xff1a;https://www.mongodb.com/try/download/community 2.安装 3.启动 在此输入命令操作数据库 mangoDB是否启动成功 ? 在浏览器访问&#xff1a;http://127.0.0.1:27017/ 出现该页面表示m…

注册表学习——注册表结构

简介&#xff1a;注册表是由很多项和值构成的。 HEKY_USERS&#xff08;HKU&#xff09; 主要保存默认用户及当前登录用户配置信息。 .DEFAULT 该项是针对未来创建的新用户所保存的默认配置项。 S-1-5-18等项 这些项叫作安全标识符&#xff08;SID&#xff09;用来表示Windows操…

HarmonyOS4.0系统性深入开发26方舟开发框架(ArkUI)概述

方舟开发框架&#xff08;ArkUI&#xff09;概述 方舟开发框架&#xff08;简称ArkUI&#xff09;为HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览…

计算机网络 第4章(网络层)

系列文章目录 计算机网络 第1章&#xff08;概述&#xff09; 计算机网络 第2章&#xff08;物理层&#xff09; 计算机网络 第3章&#xff08;数据链路层&#xff09; 计算机网络 第4章&#xff08;网络层&#xff09; 计算机网络 第5章&#xff08;运输层&#xff09; 计算机…

Offset Noise

如果尝试用stable diffusion生成特别暗或特别亮的图像&#xff0c;它几乎总是生成平均值相对接近 0.5 的图像。如下图所示&#xff0c;生成暗的图片总是带着明亮的区域&#xff08;暗的街道明亮的光&#xff09;&#xff0c;生成亮的图片总是带着暗的区域&#xff08;白的雪暗的…

list的介绍及其模拟实现

今天我们了解list&#xff0c;list在python中是列表的意思 &#xff0c;但是在C中它是一个带头双向循环链表&#xff1a; list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xf…

Cuda笔记1

1、培训001 1 1…100&#xff0c;CPU是串行执行&#xff0c;GPU是分成几部分同时计算&#xff0c;如123,456… 2、培训002 一来一回 每种定义有对应的调用位置&#xff0c;和执行位置&#xff0c;不对会报错。 下图是用NVPROF时间分析 下图是资源分析 1&#xff09; CUDA…

W3School离线手册(2017.03.11版)

点击下载 W3School离线手册(2017.03.11版)

企业软件项目成果-图像识别

下面图像识别仅仅使用了OpenCV库而已&#xff0c;并没有涉及深度学习、机器学习。 整盘样本的拍照识别结果&#xff08;识别准确率达100%&#xff09;&#xff1a; 宫颈刷图像识别的测试结果&#xff08;识别准确率达100%&#xff09;&#xff1a;

springboot druid数据库配置密码加密

1.使用的druid版本 <!-- 阿里数据库连接池 --> <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.21</version> </dependency> 2.配置文件 # Spring配置 …