Трейлинг типа возвращаемого массива

-8

auto function(int i) -> int(*)[10]{

}

Может ли кто-нибудь помочь мне, как вернуть указатель на массив из 10 целых чисел, используя возвращаемый тип возврата? Любой пример будет полезен.

спросил(а) 2021-01-25T15:26:39+03:00 4 месяца, 3 недели назад
1
Решение
78

Сначала вам нужно решить, где будут храниться целые числа, как они будут "разделяться", и отвечает ли вызывающий или вызываемый человек за всю свою жизнь.

Варианты включают...

1) возврат указателя на новую динамически распределенную память:

auto function(int i) -> int(*)[10] {
int* p = new int[10];
p[0] = 1;
p[1] = 39;
...
p[9] = -3;
return (int(*)[10])p;
}

// BTW it usually cleaner (avoiding the ugly cast above) to handle
// arrays via a pointer (but you do lose the compile-time knowledge of
// array extent, which can be used e.g. by templates)
int* function(int i) {
int* p = ...new and assign as above...
return p;
}

// either way - the caller has to do the same thing...

void caller()
{
int (*p)[10] = function();
std::cout << p[0] + p[9] << '\n';
delete[] p;
}


Обратите внимание, что 99% времени, возвращающее либо std::vector<int> либо std::array<int, 10> является лучшей идеей и что 99% оставшегося времени лучше вернуть std::unique_ptr<int[]> который вызывающий может переместить в свою собственную переменную, которая delete[] данные по мере их уничтожения путем выхода из области действия или - для переменных-членов - уничтожения содержащего объект.

2) возвращает указатель на static массив function() -local (который будет перезаписываться каждый раз, когда вызывается function, так что старые возвращенные указатели будут видеть обновленные значения, и в многопоточном коде могут быть условия гонки):

auto function(int i) -> int(*)[10]{
static int a[10] { 1, 39, ..., -3 };
return &a;
}

Вызывающий звонит так же, но не должен вызывать delete[].

ответил(а) 2021-01-25T15:26:39+03:00 4 месяца, 3 недели назад
77

Если вам все равно, является ли ваше возвращаемое значение разыменованным (и вы не указали это), следующее "вернет указатель на массив из 10 целых чисел":

auto function(int i) -> int(*)[10]
{
return nullptr;
}

ответил(а) 2021-01-25T15:26:39+03:00 4 месяца, 3 недели назад
45

#include <iostream>

const size_t sz = 10;

auto func(int i) -> int(*)[sz] /// returns a pointer to an array of ten ints
{
static int arr[sz];

for (size_t i = 0; i != sz; ++i)
arr[i] = i;

return &arr;
}

int main()
{
int i = 2;
int (*p)[sz] = func(i); /// points to an array of ten ints which funct returns which is arr array

for (size_t ind = 0; ind != sz; ++ind) /// displays the values
std::cout << (*p)[ind] << std::endl;

return 0;
}

auto function (int i) → int (*) [sz]

    это означает, что функция name function имеет параметры int, которые принимают
    int и возвращает указатель на массив из 10 int, что означает, что мы указали каждый int-элемент в массиве из десяти int. обратные типы возврата используются для удобного чтения

для возврата указателя на массив из десяти int

int я = 2; int (* p) [sz] = funct (i);

    что означает (* p) [sz] будет указывать массив из 10 ints, возвращающий функцию func, который является массивом arr и отображает значения, используя цикл

ответил(а) 2021-01-25T15:26:39+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема