#32. Ключевое слово const с указателями и переменными | Язык C для начинающих

  Рет қаралды 8,310

selfedu

selfedu

Күн бұрын

Пікірлер: 9
@andredru4278
@andredru4278 11 ай бұрын
Спасибо. Снова неожиданно!
@ГубкаБоб-р8ъ
@ГубкаБоб-р8ъ Жыл бұрын
Напомнило систему прав доступа в линукс rwx
@jamjam3337
@jamjam3337 Жыл бұрын
спасибо!👏👍
@olegkomlev
@olegkomlev Жыл бұрын
Не думал, что определять размер статического массива через константную переменную const int чем-то существенно отличается при работе программы от использования define-константы . Конечно, есть затраты на ведение таблицы имен таких констант, но это трудности этапа компиляции, да к тому же не такие уж и большие. А в откомпилированном коде не должно быть разницы, что стояло в квадратных скобках при объявлении массива - константа, подставленная препроцессором, или константная переменная, за значением которой компилятор лазил в таблицу имен. Но, как ни странно, компилятор действительно создает массив не по константе в инициализаторе, а по содержимому const-переменной. Тогда и правда использовать для длины массива при объявлении const-переменные в С - дело более накладное, чем числовые литералы или define-константы.
@РусланКарнеенко
@РусланКарнеенко 10 ай бұрын
спасибо
@anvarx1
@anvarx1 Жыл бұрын
Спасибо отличный урок. Как компилятор отличает от указателя на массив который возвращает на sizeof() размер целого массива от копии указателя который возвращает размер одного элемента? Значит указатели не только хранят адрес памяти, но и там могут хранится дополнительные данные?
@SerhiiNikulin99
@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
@anvarx1 Жыл бұрын
@@SerhiiNikulin99 Спасибо за разъяснение, значит чтобы создать клон указателя на массив мы должны написать вроде если int arr[12]={1,2,3,4,5,6,7,8,9,10,11,12}; то клон создается так int[12] * const r_array=arr; ??? или как???
@SerhiiNikulin99
@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;
1% vs 100% #beatbox #tiktok
01:10
BeatboxJCOP
Рет қаралды 67 МЛН
Quando eu quero Sushi (sem desperdiçar) 🍣
00:26
Los Wagners
Рет қаралды 15 МЛН
Что-что Мурсдей говорит? 💭 #симбочка #симба #мурсдей
00:19
Ключевое слово explicit в C++
11:45
Volodya Mozhenkov
Рет қаралды 8 М.
A const int is not a constant.
9:16
Jacob Sorber
Рет қаралды 69 М.
Циклы for и while в Си: сходство и различие
6:20
Тимофей Хирьянов
Рет қаралды 72 М.
1% vs 100% #beatbox #tiktok
01:10
BeatboxJCOP
Рет қаралды 67 МЛН