C++57个入门知识点_番外1_C++指针偏移在类中的应用及指针偏移原理

news2024/11/23 13:44:24

这是对C++指针偏移介绍比较好的博文,但是比较分散,我把其进行了整理,原博文地址请见最后,讲的很详细。

C++57个入门知识点_番外1_C++指针偏移在类中的应用及指针偏移原理

  • 1. C++指针偏移原理
  • 2. C++显示十进制内存地址(不用理解,直接使用)
  • 3. C++指针偏移在类中的应用

1. C++指针偏移原理

在C++中我们可以通过指针方便的访问各种类型数据,但我们都知道指针只是一个头地址,而我们需要遍历的数据通常占有大量的空间,那么指针是如何遍历其中的数据呢?这就涉及到指针偏移的一个问题,下面我们看个例子:

这里使用了十进制显示地址函数ip2decimal(),详情见下面的“C++显示十进制内存地址”。

	int a[4]={1,2,3,4};
	int* p=&a[0];//将数组a的初始地址传给指针p
	cout<<"指针p的地址:"<<ip2decimal(p)<<endl;
	cout<<"a的地址分别为:"<<endl;
	for (int i = 0; i < 4; i++)
	{
		cout<<ip2decimal(&a[i])<<endl;
	}
 
	for (int i = 1; i < 5; i++)
	{
		cout<<"p地址为:"<<ip2decimal(p)<<"\t数值为:"<<*p<<endl;
		p=p+1;  //指针增加一个int的偏移量
	}

结果为:
在这里插入图片描述
通过上述结果我们可以发现,对于一个存储多个数据的int数组,我们可以通过设定个int* p的指针,只需将数组头指针赋给指针p,便可以通过指针p每次增加一个int数据的偏移量准确获取每个int类型数据。这里int数据的偏移量为4,若为其它类型数据则只需偏移该类型的内存大小即可。
我们可以得出结论对于一个指针其遍历数据时,是通过数据与头地址的偏移量来获取的,而不是变量名。

2. C++显示十进制内存地址(不用理解,直接使用)

我们在C++中显示变量地址均为十六进制的,不具有直观性,尤其在分析连续存储的变量内存地址时。下面分享一个可将十六进制地址转为十进制地址显示的代码,需要注意的是,需要在文件头包含stream与string。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
 
int ip2decimal(void* ip)
{
		stringstream str;
		string ip_str;
		str<<ip;
		str>>ip_str;
        int bit=0;
        int ans=0;
        for(int i=ip_str.size();i>=0;--i)
		{
            if(ip_str[i]>='0'&&ip_str[i]<='9')
			{
                ans+=(ip_str[i]-'0')*pow(16,bit++);
            }else if(ip_str[i]>='A'&&ip_str[i]<='F')
			{
                ans+=(ip_str[i]-'A'+10)*pow(16,bit++);
            }
        }
        return ans;
}

演示:

int main()
{
	int a=100;
	cout<<"a的十六进制地址:"<<&a<<endl;
	cout<<"a的十进制地址:"<<ip2decimal(&a)<<"\n"<<endl;
	double b=12.5;
	cout<<"b的十六进制地址:"<<&b<<endl;
	cout<<"b的十进制地址:"<<ip2decimal(&b)<<"\n"<<endl;
	string str="xiaoming";
	cout<<"str的十六进制地址:"<<&str<<endl;
	cout<<"str的十进制地址:"<<ip2decimal(&str)<<"\n"<<endl;
	int matrix[3]={1,2,3};
	cout<<"matrix[0]的十六进制地址:"<<&matrix[0]<<endl;
	cout<<"matrix[0]的十进制地址:"<<ip2decimal(&matrix[0])<<endl;
	cout<<"matrix[1]的十六进制地址:"<<&matrix[1]<<endl;
	cout<<"matrix[1]的十进制地址:"<<ip2decimal(&matrix[1])<<endl;
	cout<<"matrix[2]的十六进制地址:"<<&matrix[2]<<endl;
	cout<<"matrix[2]的十进制地址:"<<ip2decimal(&matrix[2])<<endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述

3. C++指针偏移在类中的应用

我们知道通过指针访问数据时,并不是依据变量名,而是依据变量内存地址与指针的偏移量大小,具体介绍见上面的“C++指针偏移原理”。
现在我们看一个例子,有两个类people与animal:

class people
{
public:
	int  age_p;
	double weight_p;
	double height_p;
};
 
class animal
{
public:
	int  age_a;
	double weight_a;
};
 
people* p1=new people;
animal* a1;
p1->age_p=24;
p1->weight_p=140;
p1->height_p=180;

通过类的定义我们可以发现,两个类的前两个数据均为int与double,即people与animal这两个类前两项成员变量与对象指针p1、a1的地址偏移量是相同的。既然指针访问数据是根据偏移量大小而不是变量名,那么我们可不可以将p1的地址赋值给a1,然后通过a1去访问age_p与weight_p中的数据呢?

不多说直接上代码:

	a1=(animal*)p1;  //将people的对象指针p1强转成animal*并赋值给a1
	cout<<"指针a1地址:"<<ip2decimal(a1)<<endl;
	cout<<"p1->age_p:"<<a1->age_a<<endl;
	cout<<"p1->weight_p:"<<a1->weight_a<<endl;

结果为:
在这里插入图片描述
完全可行,由此可见对于对象指针访问类中成员变量,同样也是根据成员变量与对象指针的偏移量大小,而不是成员变量名。

参考博文:C++指针偏移在类中的应用;C++指针偏移原理;C++显示十进制内存地址(无需理解,拷贝即用)

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

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

相关文章

AQS原理

目录 一、原理概述二、AQS 对资源的共享方式三、AQS底层使用了模板方法模式四、使用demo&#xff0c;使用AQS实现不可重入锁五、AQS使用到的几个框架 一、原理概述 AQS全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架 AQS核心思想是&#…

Appian低代码平台

国外老牌低代码开发平台Appian Appian在国内用的比较少&#xff0c;资料也很匮乏。需要自己主动去官网寻找。 Appian 学习平台 进入Appian Community可以选择学习路径&#xff0c;可以选择适合自己的学习路径&#xff1b;我选择的是Builder路径&#xff0c; 看了足足80个小…

opencv检测二维码和条形码

文章目录 1 excel制作简单二维码2 识别二维码和条形码2.1 相关库2.2 decode解码2.3 圈出二维码的位置2.4 判断二维码是否授权 3 完整代码3.1 使用图片进行识别3.2 使用摄像头实时识别 4 总结 1 excel制作简单二维码 使用excel可以实现制作二维码&#xff0c;但只能实现做英文和…

基于51单片机的简易电子琴设计

目录 摘 要 基于51单片机的简易电子琴设计 一、系统设计 1、项目概要 2.设计任务和基本要求 二、硬件设计 1、硬件设计概要 2、时钟振荡电路模块 3.复位电路模块 5.数码管电路模块 6.蜂鸣器模块 7、乐曲切换电路模块 三、软件原理 四、软件流程图 五、代码实现 …

解析Transformer基本结构与实现

1.基本结构 ​ Transformer总体架构可分为4个部分&#xff1a; 输入部分-输出部分-编码器部分-解码器部分 输入部分包含&#xff1a; 原文本嵌入层&#xff08;Input embedding&#xff09;及其位置编码(position encoding)目标文本嵌入层及其位置编码器 文本嵌入层的作…

TCP/UDP协议重温三次握手四次挥手 简单笔记

术语储备&#xff1a; SYN&#xff1a;同步位 &#xff1b;SYN1,表示进行一个连接请求 ACK&#xff1a;确认位 &#xff1b;ACK1,确认有效 ACK0&#xff0c;确认无效 ack : 确认号 &#xff1b;对方发送序号1 seq &#xff1a; 序号 ; 标识从TCP发端向TCP收端发送的数据字节流 …

基于JPA的Repository使用详解

Spring Data JPA Spring Data是Spring提供的操作数据的框架&#xff0c;Spring Data JPA是Spring Data的一个模块&#xff0c;通过Spring data 基于jpa标准操作数据的模块。 Spring Data的核心能力&#xff0c;就是基于JPA操作数据&#xff0c;并且可以简化操作持久层的代码。…

BLOND:ISH VoxEdit 创作大赛来啦!

准备好随着 BLOND:ISH 的节拍释放你们的创造力和节奏&#xff0c;因为我们将举办一场与众不同的刺激比赛。你们可以在 BLOND:ISH VoxEdit 大赛中展示你们的才华并赢得 SAND 奖励&#xff01; &#x1f3dd;️ 比赛主题&#xff1a;ABRA 夏日派对 &#x1f3dd;️ 释放你们的想象…

【Python学习】—Python基础语法(二)

文章目录 【Python学习】—Python基础语法&#xff08;二&#xff09;一、字面量二、注释三、变量四、数据类型五、数据类型转换六、标识符七、运算符八、字符串扩展九、获取键盘输入 【Python学习】—Python基础语法&#xff08;二&#xff09; 一、字面量 字面量&#xff1…

文件类型识别的实现思路

一些网络设备&#xff0c;比如防火墙或者审计系统&#xff0c;一般都有文件过滤的功能&#xff0c;可以对用户上网传输的文件进行过滤&#xff0c;比如可以限制用户通过ftp下载word文档&#xff0c;也就是文件类型为doc或者docx的文件。 那么文件过滤的功能是怎么实现呢&#…

2023年计算机专业还值得无脑梭哈吗——计算机类专业在读一年学生个人分享

长忆观潮&#xff0c;满郭人争江上望。来疑沧海尽成空&#xff0c;万面鼓声中。 弄潮儿向涛头立&#xff0c;手把红旗旗不湿。别来几向梦中看&#xff0c;梦觉尚心寒。 IT 界每隔几年就有一波浪潮或者泡沫&#xff0c;新的一波大潮已经打过来了&#xff0c;躲&#xff1f;能跑多…

【计算机视觉】CVPR 23 新论文 | 异常检测最新改进方法:DeSTSeg

文章目录 一、导读二、背景2.1 主要贡献2.2 网络介绍&#xff1a;DeSTSeg 三、方法3.1 Synthetic Anomaly Generation 合成异常生成3.2 Denoising Student-Teacher Network 去噪教师学生网络3.3 Segmentation Network 分割网络 四、实验结果 一、导读 DeSTSeg: Segmentation G…

数字图像处理【10】直方图反向投影与模板匹配

本篇简单描述直方图在图像处理中典型的应用场景&#xff0c;属于是比较老旧的应用技术&#xff0c;但不妨拿出来再学习&#xff0c;温故而知新&#xff0c;为新知识做一个铺垫。 直方图反向投影&#xff08;Back Projection&#xff09; 还记得之前学习过的图像直方图的计算/…

Knowledge Distillation of Large Language Models

这是大模型系列模型的文章&#xff0c;针对《Knowledge Distillation of Large Language Models》的翻译。 大模型的知识蒸馏 摘要1 引言2 方法2.1 MiniLLM&#xff1a;利用逆向KLD进行知识蒸馏2.2 策略梯度优化2.3 训练算法 3 实验3.1 实验设置3.2 结果3.3 分析3.4 消融实验 …

源码编译安装LAMP——LAMP+DISCUZ论坛搭建

文章目录 一.Apache1.什么是apache2.apache的主要特点3.apache的软件版本4.编译安装优点5.安装服务的一般步骤 二.LAMP简介与概述1.LAMP平台概述2.构建LAMP平台顺序3.各组件的主要作用 三.LAMPDISCUZ论坛搭建1.部署Apache1.1 下载apache相关安装包放入服务器中1.2 解压apache的…

数学公式识别(Mathpix + pix2tex)

文章目录 数学公式识别&#xff08;Mathpix pix2tex&#xff09;1. 下载安装2. 如何使用3. 限制4. 替代品4.1 pix2tex - LaTeX OCR4.2 pix2tex&#xff08;网页版&#xff09;4.3 Simple Tex OCR 数学公式识别&#xff08;Mathpix pix2tex&#xff09; 当我们看论文时&#…

2023软件工程中各种图在现代企业级开发中的使用频率

概览 系统流程图 ✔ 数据流图 不常用 ER图 ✔ 状态转换图 ✔ Warnier图 不常用 IPO图 不常用 Petri网 不常用 层次方框图 不常用 层次图 a.k.a. H图 ✔ 1,层次图描绘软件的层次结构.层层次方框图描绘的是数据结构。 2,层次图的方框表示模块或子模块。层次方框图的方框表示数据结…

C++基础(12)——STL(vector和deque)

前言 本文主要介绍C中STL中的vector和deque容器 7.3&#xff1a;vector容器 7.3.1&#xff1a;vector容器基本概念、特点和构造函数 vector和数组的区别&#xff1a;数组是静态空间&#xff0c;一旦指定大小&#xff0c;之后就不能发生改变。vector可以动态扩展&#xff0c…

(秋招准备)三角化复习

用SVD分解继续宁特征点三角化 三角化又叫三角测量&#xff0c;本质是用相机的运动估计特征点的空间位置&#xff0c;发生在估计得到帧间运动之后(单目情况)。三角测量是指&#xff0c;通过在两处观察同一个点的夹角&#xff0c;确定该点的距离。由于双目本身就能得到视角不同的…

Java集合与数组概述

Java 集合可分为Collection 和Map 两种体系 实线是继承 虚线是实现类 1.Collection接口&#xff1a;单列数据&#xff0c;用来存储一个一个的对象。定义了存取一组对象的方法的集合 ​ List&#xff1a;元素有序、可重复的集合 -->&#xff08;动态数组&#xff09; ​ ----…