Для начала тип возврата int *
функции не имеет смысла.
int* mirror(int* p[], int n) {
Лучше объявить функцию как имеющую тип возврата void
.
Если у вас есть массив указателей типа int *
, то указатель на его элементы имеет тип int **
.
Кроме того, пользователь может передать 0 в качестве второго аргумента. Вам следует проверить этот случай.
Причиной исключения может быть то, что массив содержит недопустимые указатели, которые указывают за пределы исходного массива.
Также, если массив указателей сформирован таким образом, что необязательно, чтобы, например, первый указатель указывал на первый элемент исходного массива, тогда ваша функция не будет работать.
Функция может быть определена как
void mirror( int * p[], size_t n )
{
if ( n != 0 )
{
for ( int **first = p, **last = p + n; first < --last; ++first )
{
int tmp = **first;
**first = **last;
**last = tmp;
}
}
}
Вот демонстрационная программа
#include <iostream>
void mirror( int * p[], size_t n )
{
if ( n != 0 )
{
for ( int **first = p, **last = p + n; first < --last; ++first )
{
int tmp = **first;
**first = **last;
**last = tmp;
}
}
}
int main()
{
const size_t N = 5;
int a[N] = { 10, 30, 30, 40, 50 };
int * b[N] = { a, a + 1, a + 2, a + 3, a + 4 };
for ( const auto &item : a )
{
std::cout << item << ' ';
}
std::cout << '\n';
mirror( b, N );
for ( const auto &item : a )
{
std::cout << item << ' ';
}
std::cout << '\n';
return 0;
}
Выход программы:
10 30 30 40 50
50 40 30 30 10
Обратите внимание, что вместо замены элементов «вручную» вы можете использовать стандартную функцию std::swap
.