向指针添加偏移量

Adding an offset to a pointer

本文关键字:偏移量 添加 指针      更新时间:2023-10-16

如果我有一个指向对象的指针,我想要得到一个指向对象的指针,在指针之后的16个字节,我如何将16个字节的偏移量添加到指针?

同样,32位系统中的内存地址看起来像这样0x00000000。如果我将地址更改为0x00000001到0x00000002会跳过多少字节?

指针计数字节,所以要指向下一个字节,您需要将指针的值更改1。但是,指针算术会对指针所指向的对象进行计数,对指针进行加1会使指针的值增加其指针类型的大小。如果您想指向字节,请使用char指针,因为char的定义大小为1,并且char指针上的指针算术允许您指向字节:

T * p  = get_pointer();
char * cp = reinterpret_cast<char*>(p);
cp += 16;

转换指向和来自char类型的指针不构成类型双关语,是标准明确允许的。但是,不能使用生成的指针访问实际不在该地址的任何对象。

如果我有一个指向一个对象的指针,我想要得到一个指向一个对象的指针,在指针后面16个字节,我怎么把16个字节的偏移量加到指针上?

通过char*进行强制转换可以工作,但是这可能被认为是糟糕的做法,这取决于您的场景的细节:

T *ptr = initialize_ptr(); // Do whatever initialization you need to.
ptr = (T*)(((char*)ptr) + 16);

同样,32位系统中的内存地址看起来像这样0x00000000。如果我将地址更改为0x00000001到0x00000002会跳过多少字节?

2和1的差是1——正好一个字节将被跳过。

您可以这样做:

char *arr = (char*)((void*) ptrToSomeObject);
&arr[15]

下面发生了什么

  1. 任何ptr都可以转换为'void*'
  2. 'void *'可以转换为任何类型的ptr。
  3. arr[15] == (arr+15bytes)