Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Массив и указатель на него

#cpp #массивы #указатели


По мере изучения массивов возникло 2 вопроса:

1.

#include 
using 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 *. Нет ничего удивительного в том, что численно эти адреса совпадают. Первый элемент массива начинается в памяти точно там же, где начинается и весь массив. Второй пример - указатель на массив. Ничем принципиально от других указателей он не отличается и "работать" с ним следует так же, как и с любым другим типом указателя. Примените к этому указателю унарный оператор * - и вы получите доступ к указуемому массиву, который будет вести себя так же, как и любой другой массив.

Комментариев нет:

Отправить комментарий