c++ - 取消引用指针如何更改此代码段中的值?
问题描述
有人可以解释这里发生了什么吗?
#include "iostream"
int main(int argc, char const *argv[]) {
unsigned long var = 0x04030201;
unsigned char* ptr = NULL;
ptr = (unsigned char*) &var;
ptr[2] = 0x05;
std::cout << std::hex << var << '\n';
return 0;
}
输出:0x4050201
解决方案
您不仅要取消引用指针,还要更新值。
ptr[2] = 0x05;
更新第 3 个八位字节的值。所以,对于一个起始值
(0x) 04 03 02 01
它被修改为
(0x) 04 05 02 01
^--------- ptr[2]
要从C11
第 6.3.2.3 章添加,
[...]当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。
因此,在little-endian 系统中,它看起来像
ptr[0] = 01
ptr[1] = 02
ptr[2] = 03
ptr[3] = 04
并且您正在修改ptr[2]
,因此值更改会反映在结果中。
推荐阅读
- reactjs - 通过 index.js 重新导出 JSS 会导致不相关组件中出现不需要的重新渲染
- node.js - 从 mongodb 查找聚合中获取真或假(仅值不是数组或对象)
- python-3.x - 当我尝试使用 cv2.imshow() 打开图像时,会弹出一个空白图像窗口
- ios - JSON解码不填充表视图
- tfs - 如何配置 Team Foundation Server 2015 以强制所有工作区仅限本地?
- laravel - 在 apache 虚拟主机中部署多个 laravel 项目
- python - 只需要获取没有索引和数据类型Python的模式值
- python - 从 Python 中的不同目录导入
- php - 无法将 PayPal\Api\Amount 类型的对象用作数组
- blackberry - 无法创建调试令牌或签名栏文件