передать адрес arr [0] [2], который должен быть получен в двойном указателе - PullRequest
1 голос
/ 26 апреля 2020

нужен лучший подход для передачи адреса arr [0] [2], учитывая, что он должен быть получен в двойном указателе.

хочет передать arr [0] [2] без сохранения в любом другая переменная.

#include <iostream>
using namespace std;
int help(int **arr)
{
    cout<<**arr;
}

int main()
{
    {
    int n=3,m=3,k=0;
    int **arr = new int*[n];
    for(int i = 0; i < n; i++) {
        arr[i] = new int[m];
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            arr[i][j]=k;
            k++;
        }
    }

    int *g=*arr+2;
    int **h=&g;

    help(h);

}
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Почему бы просто не написать

int *p = &arr[0][2];

help( &p );

Если вы хотите получить доступ ко всему массиву, используя указатель типа int **, вы можете использовать следующий подход.

#include <iostream>

void help(int **arr, size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        std::cout << ( *arr )[i] << ' ';
    }

    std::cout << '\n';
}

int main() 
{
    int arr[2][3]={{1,2,3},{4,5,6}};
    int *p = reinterpret_cast<int *>( arr );

    help( &p, 6 );

    return 0;
}

Вывод программы

1 2 3 4 5 6
0 голосов
/ 26 апреля 2020

Нет лучшего способа. К сожалению, синтаксис C ++ x[y] может использоваться для обозначения двух совершенно разных операций: если x является массивом, то выполняется индексация, если x является указателем, то это косвенное обращение и индексация.

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

Тот факт, что с массивом указателей, с указатель на указатель и для двумерного массива синтаксис для достижения элемента x[y][z] не имеет значения ... это три совершенно разные операции.

...