Не думал, что определять размер статического массива через константную переменную const int чем-то существенно отличается при работе программы от использования define-константы . Конечно, есть затраты на ведение таблицы имен таких констант, но это трудности этапа компиляции, да к тому же не такие уж и большие. А в откомпилированном коде не должно быть разницы, что стояло в квадратных скобках при объявлении массива - константа, подставленная препроцессором, или константная переменная, за значением которой компилятор лазил в таблицу имен. Но, как ни странно, компилятор действительно создает массив не по константе в инициализаторе, а по содержимому const-переменной. Тогда и правда использовать для длины массива при объявлении const-переменные в С - дело более накладное, чем числовые литералы или define-константы.
@РусланКарнеенко10 ай бұрын
спасибо
@anvarx1 Жыл бұрын
Спасибо отличный урок. Как компилятор отличает от указателя на массив который возвращает на sizeof() размер целого массива от копии указателя который возвращает размер одного элемента? Значит указатели не только хранят адрес памяти, но и там могут хранится дополнительные данные?
@SerhiiNikulin99 Жыл бұрын
Если мы создадим массив int arr[12], то int* это тип его первого элемента, но сам массив в памяти имеет свой собственный тип. Он выглядит как int[12] что означает "блок памяти из 12 интов". Вместо имени массива подставляется адрес его первого элемента и поэтому он конвертируется компилятором как в int*, на сам int arr[12] имеет тип int[12]и это специальный тип данных, который представляет статический массив из 12 элементов типа int. Тип int[12] используется для хранения фиксированных массивов элементов, которые не меняют размер во время выполнения программы. При создании массива int arr[12] выделится непрерывный блок памяти, достаточный для хранения 12 значений типа int, и имя arr будет связано с этим блоком памяти. Исходя из этого компилятор понимает что в операторе sizeof(arr) аргументом является arr который в свою очередь представляет собой блок блок памяти на 12 интов, поэтому sizeof(arr) вернет размер всего блока памяти(48 байт)
@anvarx1 Жыл бұрын
@@SerhiiNikulin99 Спасибо за разъяснение, значит чтобы создать клон указателя на массив мы должны написать вроде если int arr[12]={1,2,3,4,5,6,7,8,9,10,11,12}; то клон создается так int[12] * const r_array=arr; ??? или как???
@SerhiiNikulin99 Жыл бұрын
@@anvarx1 Да, вы можете сделать указатель на массив заданного размера(в нашем случае на массив из 12 элементов): int arr[12] = { 1, 2, 3, 4... }; int(*arr_12)[12] = &arr;//если мы хотим получить адрес всего массива необходимо применить операцию '&' printf("%p ", arr); //0000003BB6D7F758 printf("%p", arr_12); //0000003BB6D7F758 обратите внимание что arr_12 имеет тип ' int (*)[12] ' - указатель на массив из 12 элементов типа int и он содержит в себе адрес массива arr если мы хотим сделать его константным то делаем это так: const int (* const arr_12)[12] = &arr;