Что означает операция разыменовывания массива? C++

Изучая итераторы, наткнулся на такой код:

int a1[] = {0,1,2,3,4,5,6,7,8,9};            
int а2[sizeof(a1)/sizeof(*a1)]; // a2 имеет тот же размер, что и a1             
// указывает на следующий элемент после последнего скопированного в а2             
auto ret = copy(begin(a1), end(a1), a2); // копирует a1 в a2            

Я не понимаю, что означает *a1 во второй строке. Интуитивно я понимаю, что *a1 - это должен быть первый элемент массива, чтобы операторы sizeof после деления вернули количество элементов массива a1. Но что конкретно означает *a1 и как это работает?

Вопрос 2: При создании обычного массива его размер должен быть указан константой времени компиляции. Значит ли это, что sizeof при компиляции неявно подставляет вместо себя результат вычисления размера?


Ответы (1 шт):

Автор решения: AlexGlebe
int a1[] = {0,1,2,3,4,5,6,7,8,9};

a1 - это объект типа массива

*a1 == * ( & a1 [ 0 ] ) - язык автоматически преобразовывает массив на указатель к первому элементу. А звёздочка к указателю означает ссылку на элемент массива. Например, записи :

* a1 = 10 ;
* ( & a1 [ 0 ] ) = 10 ;
a1 [ 0 ] = 10 ;

идентичны.

Функция размер sizeof вычисляется в момент компиляции программы. Сначала в массиве подсчитывается фактическое количество элементов. А в ассемблерном коде уже размер всего в массива в байтах (40 байт) Размер ассемблерного типа .long равен четырём байтам.

    .type   a1, @object
    .size   a1, 40
a1:
    .long   0
    .long   1
    .long   2
    .long   3
    .long   4
    .long   5
    .long   6
    .long   7
    .long   8
    .long   9

Итого: sizeof(a1) == 40 , sizeof(*a1) == 4.

→ Ссылка