首页 > 解决方案 > 取消引用指针如何更改此代码段中的值?

问题描述

有人可以解释这里发生了什么吗?

#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

标签: c++pointershexdereference

解决方案


您不仅要取消引用指针,还要更新值。

 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],因此值更改会反映在结果中。


推荐阅读