2015-09-27 2 views
0

Вот две строки кода C++, с которыми я столкнулся в OpenCV.Однопользовательский массив?

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};, «последующий код» необходимо будет переписать, если в какой-то момент времени его необходимо расширить, чтобы работать с массивом из двух или более значений.

Очевидно, что это лошади для курсов. Такие методы будут использоваться в конструкциях, которые основаны на наличии 1 или более значений в массиве (и генераторами кода, которым дана такая спецификация дизайна).

+0

Другим полезным случаем является типизация одноэлементных массивов для создания типа, который обычно может быть объявлен в стеке, обычно и в прототипах функций, и передаваться в функции, не требуя явно использовать адрес оператора; массивы естественным образом деградируют до указателей на их первый (только) элемент, поэтому он становится типом, который автоматически распространяется по ссылке, даже в 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; 

определяет два объекта.

Интересный вопрос: почему нужно определять массивы, когда в каждом массиве есть только один элемент.

Ответ на этот вопрос зависит от кода, который использует эти переменные. Не видя кода, который их использует, я должен усомниться разработчику и предположить, что нужны массивы.

Смежные вопросы