Что означает операция разыменовывания массива? 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 шт):
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.