取消引用指针如何改变此代码片段中的值?

How does dereferencing the pointer is changing the value in this code snippet?

谁能解释一下这里发生了什么?

#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,

[...] When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object.

所以,在 little-endian system 中,它看起来像

ptr[0] = 01
ptr[1] = 02
ptr[2] = 03
ptr[3] = 04 

并且您正在修改 ptr[2],因此值更改会反映在结果中。

var为unsigned long变量,32位系统为4字节,64位系统为8字节。

ptr 是指向无符号字符的指针。 ptr 查看 var 的“第一个”字节,因为它是一个 char 指针。

ptr[2] 在指针算术中相当于'*(ptr + 2)',因此该表达式为我们提供了前面 2 个字节的地址并取消引用指针。

所以,最后,十六进制值0x05将被分配给var的第3个字节。