Вы пытаетесь присвоить переменную с двойным указателем массиву... это было рассмотрено исчерпывающе, смотрите здесь для информации об этом. Более того, поскольку вы объявили
int arr[2][2] = ...;
и затем пытаетесь присвоить arr
двойному указателю
int ** ptr = ... ;
что гарантированно не сработает, следовательно, произойдет ошибка сегментации. Более того, оператор int ** ptr=(int**) arr;
фактически является приведением одного типа (т.е. [][]) к другому типу (т.е. **), несмотря на то, что они имеют тип 'int'. Они оба разные, и компилятор будет интерпретировать это совершенно по-разному...
Вы можете сделать это так:
int *ptr = &arr;
Теперь *(ptr + 1)
будет ссылаться на 0-й ряд, *(ptr + 2)
- на 1-й ряд и так далее. Единственное, что от вас требуется, это не выйти за пределы маркеров, где используется arr
, иначе может произойти переполнение или даже ошибка сегментации...
То, что вы делаете сейчас, означает создание массивов указателей, где каждый указатель был явно приведен . Следовательно, у вас будет массив указателей типа ( 0x00001, 0x00002, 0x00003 и 0x00004
).
При разыменовании эти указатели вызывают ваш segfault.
Вы не можете преобразовать линейный массив в тип указатель на указатель, поскольку int **
не содержит тех же данных int [] []
делает.
Первый содержит указатели на указатели на целые числа. Второй хранит последовательность int в линейной памяти.
int arr[2][2][2]
не является массивом массивов - это один двухмерный массив. В памяти он неотличим от int arr[4]
Что вам действительно нужно, так это
int (*ptr)[2] = arr;
Нет, int **
- это указатель на указатель на int, но двумерный массив - это массив массивов, а &(arr[0][0])
- это указатель на int.
Я считаю, что вы должны делать так:
int *ptr = arr;
cout<<*ptr;
или так:
int *ptr = &arr[0][0];
cout<<*ptr;
Попробуйте
int *ptr = arr;
Дополнительные пояснения:
Вы должны назначить адрес указателю, чтобы его можно было разграничить (я имею в виду оператор *). Что вы делаете, так это указываете ptr на ячейку памяти с адресом [0] [0]. Следовательно, вы получаете ошибку сегментации.