Я написал следующий код для указания на первую строку 2-мерного массива. Тем не менее, когда я делаю
arrayPtr = & array[0];
Я получаю
ошибка: невозможно конвертировать
double (*)[1]
вdouble*
в назначенииarrayPtr = & array[0];
Моя программа:
#include <iostream>
int main(int argc, char **argv)
{
double array[2][1];
array[0][1] = 1.0;
array[1][1] = 2.0;
double* arrayPtr;
arrayPtr = &array[0];
return 0;
}
Может кто-нибудь помочь мне понять, где я иду не так?
Вместо arrayPtr = & array[0]
, ты можешь написать
arrayPtr = array[0];
использовать свойство распада массива.
Связанные с,
квотирование C11
глава §6.3.2.1, Lvalues, массивы и функциональные обозначения
За исключением случаев, когда это операнд
sizeof
оператор,_Alignof
оператор или
унарный&
оператор или строковый литерал, используемый для инициализации массива, выражение, которое имеет
тип ‘‘ Массив типа ’’ преобразуется в выражение с типом ‘‘ Указатель на тип ’’ это указывает
к начальному элементу объекта массива и не является lvalue. […]
квотирование C++14
глава §5.3.3
Lvalue-to-rvalue
(4.1)
массив-указатель(4.2)
и функция-указатель(4.3)
стандартные преобразования не
применяется к операндуsizeof
,
и, для главы 4,2,
Lvalue или rvalue типа «Массив N T» или же «Массив неизвестных границ T» может быть преобразован в prvalue
типа «Указатель на T». Результатом является указатель на первый элемент массива.
Таким образом, при использовании в качестве операнда RHS оператора присваивания, array[0]
распадается на указатель на первый элемент массива, т.е. создает тип double*
который такой же, как LHS.
В противном случае использование &
оператор предотвращает распад массива для array[0]
который является массивом типа double [1]
,
Таким образом, &array[0]
возвращает тип, который является указателем на массив double [1]
, или же, double (*) [1]
который не совместимый с типом переменной, предоставленной в LHS присвоения, a double *
,
В вашем коде:
array
имеет тип double (*)[1]
;array[0]
имеет тип double[1]
&array[0]
(это равно array
) имеет тип double (*)[1]
(т.е. указатель на double[1]
)Примечание 1: T[]
может распасться на T*
, Так в вашем примере double[]
может распасться на double *
,
Заметка 2: a[b]
== *(a + b)
так в вашем примере &array[0]
равно & (*(array + 0))
что упрощено до array
сам.
double array[2][1];
double* arrayPtr;
arrayPtr = & array[0];
arrayPtr
имеет тип
POINTER (DOUBLE)
в то время как array
имеет тип
POINTER(POINTER(DOUBLE))
&array[0]
имеет тип
POINTER(POINTER(DOUBLE))
Вы пытаетесь назначить
POINTER (DOUBLE) <= POINTER(POINTER(DOUBLE))
Правильный способ сделать это
arrayPtr = array[0];
или же
arrayPtr = *array;