aardio - 关于字符串指针的操作

news2024/11/15 10:51:54

一、前言:

aardio中的字符串,是不可修改的。

我们对字符串变量重新赋值一个不同的字符串,并不是“修改数据”,而是“更换地址”,实际上是赋予了一个新的内存指针。

先看下图,理解一下aardio中字符串变量的定义方式:

在aardio中,不同的变量、字符串,如果内容一样,则会指向同一个指针。

就如上图,变量a、变量b、"哈哈哈"立即数 三者的指针是一样的。

在这种情况下,如果根据一个变量的指针修改了其内容,实际上可能会影响很多其他变量甚至 "立即数" 的内容。其后果是未知的。

我猜测这也是aardio不允许直接修改字符串内容的原因之一吧。

二、获取指针的方法

aardio 中可以使用如下代码获取字符串指针的函数:

  • var a = "哈哈哈";
  • var p = raw.toPointer(a); //这是字符串"哈哈哈"的指针,同时也是变量a的指针

  • var p = raw.toPointer("哈哈哈"); //这是字符串"哈哈哈"的指针,同时也是变量a的指针

windows API 也提供了获取字符串指针的函数,我们可以直接使用:

  • var a = "哈哈哈";
  • var p = ::Kernel32.lstrcpynP(a,a,0); //这是字符串"哈哈哈"的指针,同时也是变量a的指针

  • var p = ::Kernel32.lstrcpynP("哈哈哈","哈哈哈",0); //这是字符串"哈哈哈"的指针,同时也是变量a的指针

三、修改字符串的方法

aardio中没有提供直接修改字符串内容的方法,但是提供了修改内存数据的方法。

可以通过 raw.convert( ) 、raw.copy( ) 等函数改写字符串内存内容。

import console;
var a = "哈哈哈";
var b = "哈哈哈";
var p = ..raw.toPointer(a);
//var p = ::Kernel32.lstrcpynP(a,0,0);
console.dump(p); //输出指针看一下
raw.copy(p,"123",3); //修改指针处内容
raw.copy(topointer(p,3),"完",3); //修改指针偏移3处内容
raw.copy(topointer(p,6),"活",3); //修改指针偏移6处内容
console.dump(a,b,"哈哈哈"); //显示原数据,看看是否被修改
console.pause(true);

可以看出,修改一个变量的内容后,其他同内容的变量,甚至立即数"哈哈哈"都被修改了。这样会造成不可预知的后果。慎用。

四、高级一点的测试,多线程中数据是否共享

因为 aardio 中,多线程是数据独立的,内存不共享,所以理论上来说,不同线程中声明的相同内容的字符串,内存地址也是不一样的。

测试一下:

import console;
import thread
//创建a变量
var a = "哈哈哈";
var p = ..raw.toPointer(a);
console.dump(p); //输出a指针
//启动一个线程,修改"哈哈哈"内存数据
thread.invokeAndWait(
function(){
var b = "哈哈哈";
var p = ..raw.toPointer(b);
import console;
console.dump(p); //输出b指针
raw.copy(p,"123",3); //修改指针处内容
console.dump(b);
}
)
//显示a变量数据,看看是否被修改
console.dump(a);
console.pause(true);

测试结果:

可以看出,变量 a 与 b 的指针是不一样的。在线程中修改b的内容,并不影响a的内容。

这就是“线程内存独立”,体现了线程的安全性。

五、看一下buffer

buffer与string相比,就有独立的内存地址了,可以在不改变指针的情况下修改某部分内容。

每次 raw.buffer( ) 都会重新分配一块独立内存,而不是与其他相同内容的 buffer 指向同一内存。

看以下代码:

import console;
//创建两个内容相同的buffer变量
var a = raw.buffer("哈哈哈");
var b = raw.buffer("哈哈哈");
console.dump(raw.toPointer(a)); //输出a指针
console.dump(raw.toPointer(b)); //输出b指针
//对a数据进行修改
a[1]='1'#;
a[2]='2'#;
a[3]='3'#;
console.dump(a)
console.dump(b)
//看一下变量指针在修改前后是否发生变化
console.dump(raw.toPointer(a)); //输出a指针
console.dump(raw.toPointer(b)); //输出b指针
console.pause(true);

执行结果:

可以看到,两个内容相同的buffer,地址是不一样的。修改一个,也不影响另一个。同时,对buffer内容进行修改,其指针也不变。

注意:以下方式给buffer赋值,会指向同一指针:

  • var a = raw.buffer("哈哈哈");
  • var b = a; // b 与 a 相当于是同一个变量。

用以下代码测试一下:

import console;
//创建buffer变量
var a = raw.buffer("哈哈哈");
var b = a;
console.dump(raw.toPointer(a)); //输出a指针
console.dump(raw.toPointer(b)); //输出b指针
//对a数据进行修改
a[1]='1'#;
a[2]='2'#;
a[3]='3'#;
console.dump(a)
console.dump(b)
//对比变量指针是否变化
console.dump(raw.toPointer(a)); //输出a指针
console.dump(raw.toPointer(b)); //输出b指针
console.pause(true);

执行结果:

可以看出,两个变量指针一样,修改一个,另一个也随之修改。

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

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

相关文章

跳动圆点加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>跳动圆点加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…

MATLAB神经网络---激活层

reluLayer 修正线性单元 (ReLU) 层 ReLU 层对输入的每个元素执行阈值运算&#xff0c;其中任何小于零的值都设置为零。 此运算等效于 语法 layer reluLayer 创建一个 ReLU 层。 layer reluLayer(Name,Name) 创建一个 ReLU 层&#xff0c;并使用名称-值对组设置可选的 Nam…

【机器学习】机器学习与金融科技在智能投资中的融合应用与性能优化新探索

文章目录 引言机器学习与金融科技的基本概念机器学习概述监督学习无监督学习强化学习 金融科技概述股票预测风险管理资产配置 机器学习与金融科技的融合应用实时市场数据分析数据预处理特征工程 股票预测与优化模型训练模型评估 风险管理与优化深度学习应用 资产配置与优化强化…

产品管理:抓住关键要素的ABC分类法

目录 简介 ABC 分类法步骤 第一步&#xff1a;收集数据 第二步&#xff1a;处理数据 第三步&#xff1a;根据 ABC 分析表确定分类 第四步&#xff1a;绘制ABC分析图 第五步&#xff1a;根据 ABC 分析的结果&#xff0c;对 ABC 三类商品采取不同的管理策略 附&#xff1…

jenkins 自动化任务构建案例

一新建Item 输入一个名称&#xff0c;点击Freestyle project 进入到配置项 选择 This project is parameterized&#xff0c;点击String Parameter 添加 变量值 command添加执行的命令 二构建 点击build构建触发器 三查看控制台 控制台输出信息无误

双亲委派模型是什么,为什么要使用双亲委派模型

双亲委派模型是什么&#xff0c;为什么要使用双亲委派模型 在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是负责将类文件加载到JVM中的关键组件。为了确保类加载过程的安全性和稳定性&#xff0c;Java引入了一种叫做双亲委派模型&#xff08;Parent Deleg…

联合数据库,申请出战!新指标“超级老人”揭示老年健康新视角,仅用logistic分析发文二区...

说到老年数据库&#xff0c;大家最熟悉的肯定是Charls&#xff0c;实际上类似免费好用的老年数据库还有很多&#xff0c;在没有思路的时候我们不妨看一下其他数据库的文章&#xff0c;说不定能找到新的思路或者切入点。 今天介绍的这篇文章就提出来一个新的概念-“超级老人”&a…

中国(广州)国际物流装备展圆满收官,铨顺宏邀您6月上海档案展

2024年5月29日-31日&#xff0c;为期三天的第十五届中国(广州)国际物流装备与技术展览会圆满收官。此次展会汇聚了物流装备与技术领域的众多行业精英和领先企业&#xff0c;展示了最新的技术和产品。铨顺宏科技作为物联网设备和技术服务领提供商&#xff0c;携RFID、BLE、UWB和…

按位拆分+前缀和,CF 1879D - Sum of XOR Functions

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1879D - Sum of XOR Functions 二、解题报告 1、思路分析 朴素暴力O(N^2)&#xff0c;考虑优化 由于要求的是异或值乘长度&#xff0c;那么我们可以按位考虑每一位异或值的贡献 我们枚举每一位 每次遍历…

TMCM-BB1是单轴板驱动器

TMCM-BB4 简介 TMCM-BB1和TMCM-BB4是Trinamic插槽式模块的基板。TMCM-BB1是单轴板&#xff0c;提供对一个MCU模块和一个驱动器模块的访问。TMCM-BB4是一个4轴板&#xff0c;提供对41模块插槽的访问。TMCM-0930模块采用单36针PCI插座&#xff0c;整个系统采用主MCU&#xff08;…

[Shell编程学习路线]--shell中重定向和管道符(详细介绍)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月12日10点50分 &#x1f004;️文章质量&#xff1a;93分 ——前言—— 在Shell编程中&#xff0c;重定向和管道符是两个…

超声波清洗机哪家好?四大人气爆单超声波清洗机汇总安利

在日常生活中&#xff0c;我们每天都在与灰尘和污渍作斗争&#xff0c;尤其是对于那些细小、精密的物品&#xff0c;如眼镜。眼镜不仅是视力矫正的工具&#xff0c;更是我们个人形象的一部分。一副干净、明亮的眼镜可以让我们的视线更加清晰。因为保持眼镜的清洁是一件很重要的…

接上篇---dbeaver如何导入csv文件(科学计数法)以及导出csv(科学计数法如何处理)

前提由于我用的是社区版本的&#xff0c;不支持excel&#xff0c;只支持csv导入导出 1.导入时候遇见科学计数法的解决方案&#xff1b; 由于我处理的是一些合同编码&#xff0c;虽然excel我给它设置成了文本类型&#xff0c;但是另存为csv的时候还是会变成科学计数法&#xf…

【关注】科大睿智祝贺企业通过ITSS公示名单

近日&#xff0c;根据信息技术服务标准符合性评估相关规定&#xff0c;现对以下单位进行公示&#xff0c;公示期5个工作日。公示期内如有异议&#xff0c;请提供持有异议的正式书面文件&#xff0c;包括持有异议的原因及证据、单位或个人真实名称及有效联系方式。小编祝贺多家服…

音视频封装的总接

1、封装涉及的基本概念 2、音视频封装基础3、封装总结 4、PS/TS码流封装层次图

c# 绘制正玄函数 控制台绘制

1.概要 2.代码 using System;class Program {static void Main(){const int width 80; // 控制台宽度 const int height 20; // 正弦波的高度范围 const double period 10.0; // 正弦波的周期 const double amplitude 5.0; // 正弦波的振幅 for (int x 0; x < wi…

衡量网络性能的指标

带宽 测速&#xff0c;下载速度一般是MB&#xff0c;运营商用的是b&#xff0c;之间有差别&#xff0c;100M带宽就是100M b 100个人访问同一个服务器&#xff0c;那么这个服务器的并发连接数就是100&#xff0c;有上限&#xff0c;受到性能的限制&#xff0c;当前面连接好多了…

JS :深拷贝解析与实现(附structuredClone语法测试)

浅拷贝简介 深拷贝是创建一个新对象&#xff0c;这个新对象包含原对象所有属性的全新拷贝&#xff0c;无论是基本数据类型还是引用类型的数据都会被完全复制一份&#xff0c;新旧对象间不存在任何关联&#xff0c;彼此独立。 前言 OK&#xff0c;最近又又又在学习JS的过程中…

【STM32之FreeRTOS(三)】任务的调度与状态

【STM32之FreeRTOS(三)】任务的调度与状态 文章目录 【STM32之FreeRTOS(三)】任务的调度与状态一、什么是任务调度&#xff1f;二、FreeRTOS的任务调度规则1.抢占式调度运行过程2.时间片调度运行过程 三、任务的状态四、任务综合小实验1.实验需求2.CubeMX配置2.1 配置KEY1,KEY2…

学生护眼台灯哪个品牌好?一文教会你如何挑选学生护眼台灯

台灯作为我们日常生活中重要的桌面照明工具&#xff0c;对于办公族的工作和学生的学习都扮演着关键角色。长期使用质量不佳的台灯可能会对我们的视力健康造成不利影响&#xff0c;尤其是对于眼睛尚在发育阶段的学生来说&#xff0c;这种影响更为显著。因此&#xff0c;在选择台…