#32. Ключевое слово const с указателями и переменными | Язык C для начинающих
Вставка
- Опубліковано 28 гру 2024
- Практический курс по C/C++: stepik.org/cou...
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru...
Варианты записи и порядок работы ключевого слова const с указателями. Как работает объявление переменных с ключевым словом const.
Спасибо. Снова неожиданно!
спасибо!👏👍
спасибо
Не думал, что определять размер статического массива через константную переменную const int чем-то существенно отличается при работе программы от использования define-константы . Конечно, есть затраты на ведение таблицы имен таких констант, но это трудности этапа компиляции, да к тому же не такие уж и большие. А в откомпилированном коде не должно быть разницы, что стояло в квадратных скобках при объявлении массива - константа, подставленная препроцессором, или константная переменная, за значением которой компилятор лазил в таблицу имен.
Но, как ни странно, компилятор действительно создает массив не по константе в инициализаторе, а по содержимому const-переменной. Тогда и правда использовать для длины массива при объявлении const-переменные в С - дело более накладное, чем числовые литералы или define-константы.
Напомнило систему прав доступа в линукс rwx
Спасибо отличный урок. Как компилятор отличает от указателя на массив который возвращает на sizeof() размер целого массива от копии указателя который возвращает размер одного элемента? Значит указатели не только хранят адрес памяти, но и там могут хранится дополнительные данные?
Если мы создадим массив 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 байт)
@@SerhiiNikulin99 Спасибо за разъяснение, значит чтобы создать клон указателя на массив мы должны написать вроде
если
int arr[12]={1,2,3,4,5,6,7,8,9,10,11,12};
то клон создается так
int[12] * const r_array=arr;
??? или как???
@@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;