указатель массива в выражениях преобразуется (за редким исключением) на указатель на его первый элемент.
от C Standard (6.3.2.1 Lvalues, массивы , и функции)
3 исключением случаев, когда это операнд оператора SIZEOF или унарный & оператора, или является строка символов используется для инициализации массива, выражения, которое имеет типа «» массив типа «» преобразуется к выражению с типом '' указатель на тип '', который указывает на исходный элемент объекта массива и не является значением lvalue. Если объект массива имеет класс хранения регистров, поведение не определено.
И от стандарта C++ (4.2 Массива к указателю преобразования)
1 именующим или RValue типа «массив NT» или «массив неизвестного связанного Т» может быть преобразуется в prvalue типа «указатель на T». Результат является указателем на первый элемент массива.
Таким образом, эта декларация
double *p1 = array;
эквивалентно
double *p1 = &array[0];
^^^
Рассмотрим эту показательной программы
$include <iostream>
int main()
{
double array[] = { 1000.0, 2.0, 3.4, 17.0, 50.0 };
std::cout << "sizeof(array) = " << sizeof(array) << std::endl;
std::cout << "sizeof(array + 0) = " << sizeof(array + 0) << std::endl;
}
Выход программы
sizeof(array) = 40
sizeof(array + 0) = 8
В первом выходном выражении обозначение массива используется в качестве операнда оператора sizeof
. Таким образом, нет преобразования от типа double[5]
до double *
.
Во втором выходном выражении обозначение массива используется в выражении array + 0
, которое, в свою очередь, используется в качестве операнда оператора sizeof
. В этом случае происходит преобразование типа double[5]
в тип double *
.
Поскольку массив является адресом/указателем? –
Переменная нет? – markzzz
@FirstStep: Нет, массив - это * не * адрес. Выражение массива неявно преобразуется в адрес его 0-го элемента в большинстве контекстов. –