来自我写的:http://blog.qdac.cc/?p=4440

-----------------------------------------------

我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件。下面是我的写法,如果有更简单的方法,请留言告知。

本人再学习的过程中,遇到很多难题,delphi很多地方自身的设计就很乱。
比如对参数修饰符的理解,网上100篇文章 90篇都有问题 错误率非常高。delphi 的数据类型有很多
同一个参数修饰符 修饰 不同数据类型 的意义都是有差异的。你或许认为你知道 传值与传址;
传址 又可分2种情况,你可知道。

---------------------------------------------------------------

再比如 把指针 转换成 16进制。网上有很多人的写法 都不是标准的。可以讨论下,我弄了一个标准的写法,兼容32位与64位。

从IntToHex()说起,这个方法 官方设计时 是如何想的 我不懂;反正乱,这也是导致很多人 把指针转换成16 多种写法的主要原因。

看下图 官方提供了 3个函数:

你要知道 32位程序,指针是无符号32位的 即Cardinal 类型;64位是 UInt64 类型。

官方上面三个函数中提供了 Uint64 入参,却没有提供Cardinal入参的重载。

再看这三个函数的实现:

function IntToHex(Value: Integer; Digits: Integer): string;
beginResult := _IntToHex(Cardinal(Value), Digits);
end;function IntToHex(Value: Int64; Digits: Integer): string;
beginResult := _IntToHex(Value, digits);
end;function IntToHex(Value: UInt64; Digits: Integer): string;
beginResult := _IntToHex(Value, digits);
end;

你会发现第一个函数,Integer的这个 内部又转成了 Cardinal ,然后调用了_IntToHex ,而这个函数的入参是Uint64,所以又再次把Cardinal 转成了UInt64;折腾不折腾,多写一个函数会死啊;上面三个函数 都调用了 _IntToHex,我们接下来看这个函数;

function _IntToHex(Value: UInt64; Digits: Integer): string;

他的入参是 UInt64,所以说 上面三个IntToHex 最终都变成了UInt64;为什么最终 都用了 UInt64,我们要看这个函数的名字: IntToHex 意思是把整型转成16进制,而无符号64位 所能表达的范围最广,能兼容一切整型;即Int8、UInt8、Int32、UInt32(Cardinal)、Int64都能转换成 UInt64 而不溢出。

罢了 罢了 不管官方的设计了,我们只能再官方的基础上 做我们想做的事:

拿到栈中指针的地址与堆中数据的地址的标准写法是(谁不同意欢迎讨论):

procedure TForm4.Button1Click(Sender: TObject);
vars: string;
begins := 'QDAC';//标准写法Memo1.Lines.Add('栈中指针地址:' + IntToHex(UInt64(Pointer(@s)), SizeOf(s)*2));Memo1.Lines.Add('堆中数据地址:' + IntToHex(UInt64(Pointer(s)), SizeOf(s)*2));
end;

转载于:https://www.cnblogs.com/del88/p/6392498.html

学习中的一些牢骚。字符串栈/堆的址标准写法。相关推荐

  1. 算法学习1:定容字符串栈的Java实现

    算法学习1:定容字符串栈的Java实现 代码 import java.io.File; import java.io.FileNotFoundException; import java.util.S ...

  2. C语言之程序中内存的来源:栈 堆 数据段

    程序在运行的时候,其内存的来源主要通过三种方法:  栈  堆  数据段,总体上来讲栈是一般用来存放小内存的局部变量,堆内存和数据段的属性很像,在使用的的时候,如果这个变量是伴随程序一直存在则使用全局变 ...

  3. 程序中变量分布的区域总结 堆 栈 字符常量区 全局数据区 静态存储区

    程序中变量分布的区域总结 堆 栈 字符常量区 全局数据区 静态存储区 #include "stdafx.h" #include <stdio.h> #include & ...

  4. java学习中,字符串使用(比较、构造方法)(java 学习中的小记录)

    java学习中,字符串使用(比较.构造方法)(java 学习中的小记录)作者:王可利(Star·星星) String的使用 1.在内存中是如何保存字符串. == :比较的是地址(引用数据类型) equ ...

  5. 【C深入】程序中的三国天下,栈,堆,静态内存

    1 栈 1.1 程序中的栈 栈是现代计算机程序里最重要的概念之一. 栈在程序中用于维护函数调用上下文. 函数中的参数和局部变量存储在栈上. 栈是一种后进先出的行为. 1.2 函数调用过程 栈保存了一个 ...

  6. DDos攻击,使用深度学习中 栈式自编码的算法

    转自:http://www.airghc.top/2016/11/10/Dection-DDos/ 最近研究了一篇论文,关于检测DDos攻击,使用了深度学习中 栈式自编码的算法,现在简要介绍一下内容 ...

  7. c语言中栈堆,C语言中堆和栈的区别

    二.堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用malloc ...

  8. c语言中栈堆,全程剖析C语言中堆和栈的区别

    C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...

  9. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  10. Java笔记(学习中。。)

    Java笔记 eclipse的使用 常用的dos指令 预备知识 基本语法 变量 关于字符型 关于String 进制转换 运算符 流程控制 数组 数组的内存解析: 数组的Arrays工具类 面向对象 对 ...

最新文章

  1. 软件项目随着数据量的不断增加,有什么优化方案么?
  2. Centos7如何轻松配置yum国内源
  3. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题
  4. 优化MySQL数据类型——《深究MySQL》
  5. c语言 方法重载 冲定义,C++ 重载(overload)、重写(overrride)、重定义(redefine)
  6. XCTF_Web_新手练习区:view_source
  7. 通过导入txt数据画出python turtle图形_【Python】txt文件读取绘画
  8. nyoj914Yougth的最大化(二分搜索 + 贪心)
  9. [Vue进阶]为什么我的代码让别人看起来头皮发麻?
  10. CSDN博客排名20000以后的用户怎么查询具体排名
  11. Nginx+Tomcat负载均衡群集
  12. Ribbon客户端负载均衡算法分析
  13. 线性代数学习之行列式
  14. 投入大小的伪原创工具
  15. 计算机网络奇偶校验码题目,计算机网络试题(考试必备)分解.doc
  16. 08CMS之数据库操作
  17. 图片和视频混合广告栏轮播实现
  18. js外链跳转_给网站外链进行重定向跳转
  19. 用Python写了一个不起床让你后悔的闹钟
  20. (转)execute、executeQuery和executeUpdate之间的区别

热门文章

  1. system.js 替换 require.js
  2. Centos 上面用Shell脚本一键安装LAMP环境
  3. RMAN-06217: 错误
  4. 关于mpvue 切换页面数据没清空
  5. 用dockers实现mysql主从同步
  6. 高性能相关----爬虫
  7. 学习webbench需要掌握的基础知识(webbench源代码学习心得)
  8. PYTHON_SPLIT
  9. Struts(一)struts2.2概述与MVC模式深度剖析
  10. 【转】如何学会独立思考?