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

Поділитися
Вставка
  • Опубліковано 28 гру 2024
  • Практический курс по C/C++: stepik.org/cou...
    Телеграм-канал: t.me/java_and_c
    Инфо-сайт: proproprogs.ru...
    Варианты записи и порядок работы ключевого слова const с указателями. Как работает объявление переменных с ключевым словом const.

КОМЕНТАРІ • 9

  • @andredru4278
    @andredru4278 11 місяців тому +2

    Спасибо. Снова неожиданно!

  • @jamjam3337
    @jamjam3337 Рік тому +3

    спасибо!👏👍

  • @РусланКарнеенко
    @РусланКарнеенко 11 місяців тому +2

    спасибо

  • @olegkomlev
    @olegkomlev Рік тому +2

    Не думал, что определять размер статического массива через константную переменную const int чем-то существенно отличается при работе программы от использования define-константы . Конечно, есть затраты на ведение таблицы имен таких констант, но это трудности этапа компиляции, да к тому же не такие уж и большие. А в откомпилированном коде не должно быть разницы, что стояло в квадратных скобках при объявлении массива - константа, подставленная препроцессором, или константная переменная, за значением которой компилятор лазил в таблицу имен.
    Но, как ни странно, компилятор действительно создает массив не по константе в инициализаторе, а по содержимому const-переменной. Тогда и правда использовать для длины массива при объявлении const-переменные в С - дело более накладное, чем числовые литералы или define-константы.

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ Рік тому +4

    Напомнило систему прав доступа в линукс rwx

  • @anvarx1
    @anvarx1 Рік тому +7

    Спасибо отличный урок. Как компилятор отличает от указателя на массив который возвращает на sizeof() размер целого массива от копии указателя который возвращает размер одного элемента? Значит указатели не только хранят адрес памяти, но и там могут хранится дополнительные данные?

    • @SerhiiNikulin99
      @SerhiiNikulin99 Рік тому +9

      Если мы создадим массив 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 Рік тому +1

      @@SerhiiNikulin99 Спасибо за разъяснение, значит чтобы создать клон указателя на массив мы должны написать вроде
      если
      int arr[12]={1,2,3,4,5,6,7,8,9,10,11,12};
      то клон создается так
      int[12] * const r_array=arr;
      ??? или как???

    • @SerhiiNikulin99
      @SerhiiNikulin99 Рік тому +7

      @@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;