我有一个结构数组,我创建了一个指向结构中第一个元素的指针。我看到我的代码在指针上使用了++
运算符,如下所示: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
答案 0 :(得分:7)
++
,当应用于指针时,将指针前进到下一个项目。它通过根据指向的项目的大小进行缩放来实现。
因此,如果您char *pc
指向位置0x1000
,pc++
会将其推进到下一个char
或0x1001
。但是,int *pi
(假设sizeof (int)
为4
)会从位置0x1000
前进到0x1004
。
除非你在不同的指针之间进行投射,否则这通常不需要担心。我只想说:
RGBA colours[nVertices];
RGBA *pColour = colours; // same as &(colours[0])
pColour++; // now &(colours[1])
只会将pColour
推进到colours[1]
。
答案 1 :(得分:4)
ptrStruct++
指针向前迈步并指向数组中的下一个元素。编译器知道数组中每个元素的大小,然后每个++
根据该大小推进内存中的指针。
RGBA colours[nVertices]; // Assume `sizeof(RGBA)` is 4bytes
RGBA *pColour = colours;
sizeof(a[0])
<------------>
+------------+------------+-------------+--------
| | | |
| 4bytes | 4bytes | 4bytes | 4by...
| | | |
+------------+------------+-------------+--------
^ ^
| |
before after++
pColour pColour
作为指向大小为4 RGBA
的指针,每个++
对编译器说,前进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++]);
答案 2 :(得分:3)
它将递增到数组中包含的下一个内存地址。实际上,address + sizeof(array[0]).
这适用于任何(完整)类型。
答案 3 :(得分:1)
您已将指针声明为
RGBA *pColour = colours;
所以做pclour ++意味着pcolour + sizeof(RGBA)
答案 4 :(得分:0)
它将前进到列表中的下一个项目。我会留下这个评论,但我还不能。
答案 5 :(得分:0)
ptrStruct ++将使ptrStruct指向数组中的下一个结构。