2015-09-27 40 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; 

定义两个对象。

有趣的问题是为什么当每个数组中只有一个元素时需要定义数组。

该问题的答案取决于使用这些变量的代码。在没有看到使用它们的代码的情况下,我必须向开发人员提供疑问,并假定需要数组。