2013-04-24 65 views
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 
+0

你明白了,進入下一個陣列位置。 ++總是在指針上做這件事,你不能爲指針重載++。 – john 2013-04-24 05:39:20

+6

它將遞增到數組中包含的下一個存儲器地址。實際上,'address + sizeof(array [0])'。 – Yuushi 2013-04-24 05:39:51

+1

@Yuushi我認爲這是值得我回復的答案。 – Jace 2013-04-24 05:40:22

回答

7

++,當應用於指針時,將所述指針前進到下一個項目。它通過基於指向的項目大小進行縮放來完成此操作。

所以,如果你在位置0x1000char *pc指點,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]

0

它會提前到列表中的下一個項目。我會留下這個評論,但我還不能。

+0

我知道這一點,但我問的是確切的行爲。是C++的一部分還是作爲運算符重載實現?它可以用於每種數據類型嗎? – Pacha 2013-04-24 05:40:08

+0

@Pacha:指針上'++'的行爲被嵌入到語言的定義中(C++標準)。但是,出於操作符重載解析的目的,C++標準13.6定義了類似於用戶定義的操作符重載的特定形式的「候選操作符函數」。它們當然不是作爲任何文件中的實際代碼存在的。 – 2013-04-24 05:41:06

+0

這只是一個基本的算術運算。指針只是一個地址,它是一個(現在通常是)32或64位無符號整數。 – Yuushi 2013-04-24 05:41:52

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++]); 
1

聲明該指針

RGBA *pColour = colours; 

這樣算下來pclour ++意味着pcolour +的sizeof(RGBA)

3

它將遞增到數組中包含的下一個存儲器地址。有效地,address + sizeof(array[0]).這適用於任何(完整)類型。

0

ptrStruct ++將使ptrStruct指向數組中的下一個結構體。

+2

@Downvoter請在投票之前發表評論。 – 2013-04-24 05:45:46