#cpp #массивы #указатели
По мере изучения массивов возникло 2 вопроса: 1. #includeusing std::cout; using std::cin; int main (void) { setlocale(LC_ALL, "ru"); int a[5]; cout << a << "\n" << &a << "\n"; system("pause"); } Почему выводится один и тот же адрес? Как читал, а - указатель на первый элемент массива. Мы выводим адрес этого первого элемента, а затем адрес указателя на него, но адрес один и тот же. Можете прояснить ситуацию? 2. Запись int a[5] и int (*a)[5] Что означает второй пример, как с ним работать (с помощью new) и в чём его отличие от первого.
Ответы
Ответ 1
a - это не "указатель на первый элемент массива". a - это сам массив. Массив не является указателем. Однако в некоторых (весьма многочисленных) контекстах значение типа "массив" неявно автоматически преобразуется к значению типа "указатель на элемент массива". Этот указатель указывает на первый (нулевой) элемент массива. Отсюда и возникает иллюзия того, что массив является указателем. Но производится такое преобразование не всегда. Унарный встроенный оператор & - как раз пример исключения: операнд унарного & остается массивом. Поэтому в вашем случае &a - это не "адрес указателя", как вы неверно предположили, а адрес всего массива a. Он имеет тип int (*)[5]. В то же время проcто a в вашем примере подвергается такому преобразованию, т.е. дает указатель на первый элемент массива. Он имеет тип int *. Нет ничего удивительного в том, что численно эти адреса совпадают. Первый элемент массива начинается в памяти точно там же, где начинается и весь массив. Второй пример - указатель на массив. Ничем принципиально от других указателей он не отличается и "работать" с ним следует так же, как и с любым другим типом указателя. Примените к этому указателю унарный оператор * - и вы получите доступ к указуемому массиву, который будет вести себя так же, как и любой другой массив.
Комментариев нет:
Отправить комментарий