如果我有一个指向对象的指针,并且我想获得一个指向对象的指针,该对象在指针之后说16个字节,我该如何向指针添加16个字节的偏移量?
此外,32位系统中的内存地址看起来像这样0x00000000。如果我将像0x00000001这样的地址更改为0x00000002会跳过多少字节?
答案 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]
引擎盖下发生的事情