向指针添加偏移量

时间:2011-08-27 01:13:55

标签: c++ pointers

如果我有一个指向对象的指针,并且我想获得一个指向对象的指针,该对象在指针之后说16个字节,我该如何向指针添加16个字节的偏移量?

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

3 个答案:

答案 0 :(得分:9)

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

T * p  = get_pointer();

char * cp = reinterpret_cast<char*>(p);

cp += 16;

与char类型之间的转换指针不构成类型惩罚,并且标准明确允许。但是,您不得使用生成的指针访问实际上不在该地址的任何对象。

答案 1 :(得分:2)

  

如果我有一个指向对象的指针,并且我想获得一个指向对象的指针,该对象在指针之后说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 - 将跳过一个字节。

答案 2 :(得分:1)

你会这样做:

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

引擎盖下发生的事情

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