2

我有一个结构数组,我创建了一个指向结构中第一个元素的指针。我已经看到++我的代码中在指针上使用了运算符,例如:ptrStruct++,这到底是做什么的?转到下一个数组位置?还是用作运算符重载?

代码在这里,对象来自Ogre3D:

RGBA colours[nVertices];
RGBA *pColour = colours;
rs->convertColourValue(ColourValue(1.0,0.0,0.0), pColour++); //0 colour
rs->convertColourValue(ColourValue(1.0,1.0,0.0), pColour++); //1 colour
rs->convertColourValue(ColourValue(0.0,1.0,0.0), pColour++); //2 colour
4

6 回答 6

7

++,当应用于指针时,将所述指针前进到下一项。它通过根据所指向的项目的大小进行缩放来做到这一点。

因此,如果您有一个char *pc指向位置0x1000pc++将其推进到下一个char,或0x1001。但是,int *pi(假设sizeof (int)4)将从位置前进0x10000x1004

这不是您通常需要担心的事情,除非您在不同的指针之间进行转换。可以这么说:

RGBA colours[nVertices];
RGBA *pColour = colours;    // same as &(colours[0])
pColour++;                  //     now &(colours[1])

将简单地提前pColour指向colours[1]

于 2013-04-24T05:42:10.550 回答
4
ptrStruct++

指针向前移动并指向数组中的下一个元素。编译器知道数组中每个元素的大小,然后每个元素++根据该大小在内存中推进指针。

RGBA colours[nVertices];  // Assume `sizeof(RGBA)` is 4bytes
RGBA *pColour = colours;

      sizeof(a[0])                                 
     <------------>                                
     +------------+------------+-------------+--------
     |            |            |             |     
     |   4bytes   |   4bytes   |   4bytes    |  4by...   
     |            |            |             |     
     +------------+------------+-------------+--------
     ^            ^                                
     |            |                                
   before       after++ 
   pColour      pColour 

作为一个RGBA大小为 4 的指针,每个都++对编译器说,向前推进 4 个字节。也就是说,单步的长度是4个字节。

此外,您可以重写代码如下:

RGBA colours[nVertices];
int i = 0;
rs->convertColourValue(ColourValue(1.0,0.0,0.0), colours[i++]);
rs->convertColourValue(ColourValue(1.0,1.0,0.0), colours[i++]);
rs->convertColourValue(ColourValue(0.0,1.0,0.0), colours[i++]);
于 2013-04-24T05:40:02.747 回答
3

它将递增到数组中包含的下一个内存地址。实际上,address + sizeof(array[0]).这适用于任何(完整)类型。

于 2013-04-24T05:43:04.727 回答
1

您已将指针声明为

RGBA *pColour = colours;

所以做 pclour++ 意味着 pcolour + sizeof(RGBA)

于 2013-04-24T05:41:57.063 回答
0

它将前进到列表中的下一个项目。我会将此作为评论,但我还不能。

于 2013-04-24T05:39:15.260 回答
0

ptrStruct++ 将使 ptrStruct 指向数组中的下一个结构。

于 2013-04-24T05:43:18.260 回答