Рассмотрим код:
double func(double a[3])
{
/* do something with a and return */
}
int main(void)
{
std::vector<double> test(LARGE_NUM_DIVISIBLE_BY_3);
for (size_t i = 0; i < LARGE_NUM_DIVISIBLE_BY_3 / 3; ++i)
{
test[3 * i] = /* some random double */;
test[3 * i + 1] = /* some random double */;
test[3 * i + 2] = /* some random double */;
double val = func(&test[3 * i]);
}
}
Это определенное поведение в С++ 11? То есть, могу ли я передать указатель (&test[3 * i]) на функцию, которая ожидает массив (double func(double a[3]))? Я знаю, что если бы я пошел другим путем (т. е. передал бы массив функции, которая ожидает указатель), массив распадется на указатель - работает ли обратное?
Вы говорите массив и показываете вектор. Это то, что вы имели в виду?
@NathanOliver: я не согласен с повторяющимся тегом - я хочу знать, является ли обратная ситуация в этом вопросе законной, как я уже ясно указал.
И дурак объясняет, что это так. void by_value(const T* array) // const T array[] means the same
@NathanOliver: на самом деле прямо указано «при передаче массива» (тогда как я хочу передать указатель) прямо перед этим блоком кода, но я верю вам, что это работает и в обратном направлении. Это была и моя интуиция.





Вы не можете передавать такие массивы. Любое объявление аргумента, например double a[] (с размером или без него), транслируется компилятором как указатель double* a.
А массивы естественно распадается указателям на их первый элемент. Итак, если у вас есть массив действительный (а не вектор), например
double test[SOME_SIZE];
затем передача его, когда ожидается указатель (например, test), передаст указатель на его первый элемент (&test[0]).
Однако для векторов это невозможно, и вы должны явно передать указатель, как вы уже это делали.
Нет,
aне будет возвращен, он просто используется для расчета возвращаемого значения.