C/C++指针
某些算数运算可以用于非const指针,使其指向另一个位置
++ // 自增
+=
--
-=
这种方法在数组、非类型化数据缓冲区中尤其有用
void*
指针以一个char的大小(1B)增减;类型化指针按其指向的类型的大小增减
常量转换为指针
指针存储的地址实际上也是一个整数,因此可以将整数转换为指针类型
这个技巧可以用来计算成员偏移量,或者判断非法指针
但这种转换不能用于内存访问
定义一个结构体,现在要获取data
成员的偏移量,就可以使用这种技巧
struct Test{
int a;
// some other members
Test* next;
char data[1];
};
size_t offset = (char*)(&((Test*)1)->data) - (char*)(1);
将常量(整型)转换为指针的语义是
将该常量所代表的地址,作为该指针类型所指向类型的一个对象的起始地址
因此,上面转换的含义是,将0x1作为一个Test对象的起始地址,获取其data成员的地址,然后再减去起始地址,得到data成员,相对Test结构体起始地址的偏移量
从下面的结果可以看到,data成员的地址为0x11-->17
,计算得到偏移量为16,结果符合预期
参考文档
Microsoft Learn