2015-09-27 77 views
0

這是我在OpenCV中遇到的兩行C++代碼。單成員數組?

const Point* ppt[1] = { rookPoints[0] }; 
int npt[] = { 20 }; 

那是什麼和之間的區別如下:

const Point* ppt = rookPoint[0]; 
int npt = 20; 

請問一個成員陣列有超過一個變量的任何特別的優勢?

+0

一個想法 - 在未來它可以擴展到多個成員而無需更改任何其他代碼。 –

回答

1

使用1單元數組意味着如果數組中元素的數量增加,則使用它的代碼不必改變。

優點進來結合其它技術,沒有特別因爲用1個元素的數組

例如,給定像

int npt[] = {20}; 

的後續碼可能會做

for (i = 0; i < sizeof(npt)/sizeof(*npt); ++i) 
{ 
     // do something worthwhile with npt[i] 
} 

如果隨後將npt[]的定義更改爲

int npt[] = {20, 30, 40}; 

那麼後面的代碼仍然可以按預期工作。

鑑於,如果我們用int npt = {20};表示,如果在將來的某個時間需要擴展以處理2個或更多值的數組,則需要重寫「後續代碼」。

顯然它是課程的馬匹。這種技術將用於基於數組中有1個或更多值的設計(以及通過給出這樣的設計規範的代碼生成器)中。

+0

另一個有用的例子是typedef-one-element數組來創建一個類型,這個類型可以正常地在函數原型中聲明在堆棧上,並傳遞給函數而不需要明確地使用操作符的地址;數組自然會降級爲指向其第一個(唯一)元素的指針,因此它會成爲一種自動傳遞,即使在C中也是如此的類型.GMP廣泛使用這種技術。 – ShadowRanger

+0

你的解釋非常出色!現在看來問題已經解決了。 – DzReal

+0

@ShadowRanger該技術也使代碼難以理解,例如GMP代碼看起來像是按值傳遞變量,但實際上它們是通過引用傳遞的。 –

0

從句法上看,差異是顯而易見的。

const Point* ppt[1] = { rookPoints[0] }; 
int npt[] = { 20 }; 

限定兩個陣列而

const Point* ppt = rookPoint[0]; 
int npt = 20; 

定義兩個對象。

有趣的問題是爲什麼當每個數組中只有一個元素時需要定義數組。

該問題的答案取決於使用這些變量的代碼。在沒有看到使用它們的代碼的情況下,我必須向開發人員提供疑問,並假定需要數組。