c语言中通过指针将数值赋值到制定内存地址
来源:互联网 发布:王者荣耀数据互通吗 编辑:程序博客网 时间:2024/06/03 20:41
1.一种直观的方法
假设现在需要往内存0x12ff7c地址上存入一个整型数0x100。我们怎么才能做到呢?
我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质不就是一个指针嘛。所以我们可以用下面的方法:
int
*p = (
int
*)
0x12ff7c
;
*p =
0x100
;
需要注意的是将地址0x12ff7c赋值给指针变量p的时候必须强制转换。
1.1 为什么在此处,我们敢往0x12ff7c这个地址赋值呢?
至于这里为什么选择内存地址0x12ff7c,而不选择别的地址,比如0xff00等。这仅仅是为了方便在Visual C++ 6.0上测试而已。如果你选择0xff00,也许在执行*p = 0x100;这条语句的时候,编译器会报告一个内存访问的错误,因为地址0xff00处的内存你可能并没有权力去访问。既然这样,我们怎么知道一个内存地址是可以合法的被访问呢?也就是说你怎么知道地址0x12ff7c处的内存是可以被访问的呢?其实这很简单,我们可以先定义一个变量i,比如:
int
i =
0
;
变量i所处的内存肯定是可以被访问的。然后在编译器的watch窗口上观察&i的值不就知道其内存地址了么?这里我得到的地址是0x12ff7c,仅此而已(不同的编译器可能每次给变量i分配的内存地址不一样,而刚好Visual C++ 6.0每次都一样)。你完全可以给任意一个可以被合法访问的地址赋值。得到这个地址后再把“int i = 0;”这句代码删除。一切“罪证”销毁得一干二净,简直是做得天衣无缝。
2.另一个方法
除了这样就没有别的办法了吗?未必。我们甚至可以直接这么写代码:
*(
int
*)
0x12ff7c
=
0x100
;
这行代码其实和上面的两行代码没有本质的区别。先将地址0x12ff7c强制转换,告诉编译器这个地址上将存储一个int类型的数据;然后通过钥匙“*”向这块内存写入一个数据。
上面讨论了这么多,其实其表达形式并不重要,重要的是这种思维方式。也就是说我们完全有办法给指定的某个内存地址写入数据的。
- c语言中通过指针将数值赋值到制定内存地址
- c语言中通过指针将数值赋值到制定内存地址
- 指针将数值赋值到制定内存地址
- C语言中给指定的内存地址赋值(通过指针)
- 用C语言给指定的内存地址赋值(通过指针)
- 6、指针1 (指针定义理解、将数值存储到指定的内存地址)
- c语言中const 类型变量地址赋值给指针。
- C语言中,将结构体指针传入函数后,内存地址没变,内存数据发生变化
- 将地址赋值给指针
- C语言指针赋值
- C语言通过两个指针挖取字符串,并存入到二级指针中
- C语言中指针与地址
- C语言的内存与地址(C和指针)
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C++显式转换(2)-dynamic_cast
- Android国际化
- GYM 100090 K.Bracket Sequence(水~)
- 集成方法:渐进梯度回归树GBRT(迭代决策树)
- 关于开发中使用writeToFile时的注意事项
- c语言中通过指针将数值赋值到制定内存地址
- AndroidStudio资源(res)目录重构改进
- Oracle 分组排序函数
- python3 Django mysql数据库配置问题
- 从零移植uboot 2017 到nuc970(第十天)
- Android studio 2.3升级之坎坷
- 作品随笔
- 业务赋能利器之外卖特征档案
- 【听讲座】蚂蚁金服首席科学家漆远:人工智能驱动的金融生活服务