Указывать на конкретные ряды двумерных массивов

Я написал следующий код для указания на первую строку 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;
}

Может кто-нибудь помочь мне понять, где я иду не так?

2

Решение

Вместо 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 *,

2

Другие решения

В вашем коде:

  • 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 сам.

2

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;
1
По вопросам рекламы [email protected]