Познавательно! Последняя фраза очень поразила меня и заставила задуматься, вот я, иногда, вместо 3 пишу 0b11, на деле это бессмысленно, ведь код становится нечитабельным и тут я показываю не свои познания в области информатики, а свою небрежность к коду, в итоге программа скомпилирует, почти одинаковый код. Кстати, спасибо за превосходный видеоурок!
Классный урок! хоть это показано, но я бы ещё добавил чуть более явное объяснение о логике поиска элемента массива (то что происходит при использовании среза и передачи ему индекса - 8:38) по формуле: +(*)
Отлично! Поскольку берется данные из ячейки, адрес которой есть просто сумма начального адреса (пусть, ptr_ar=106) и смещения (в данном случае=2), то получается, что мы берем данные из ячейки 106+2=108. И неважно, как мы это вычислили: 106+2 или 2+106. Спасибо Вам за ваши уроки!
short *ptr_ar; определяет указатель, который работает с данными типа short; здесь тип short относится не к указателю, размер указателей всегда соответствуют разрядности программы. Если она 32-х разрядная, то указатели занимают 4 байта. Именно это и отражено в ролике.
sizeof(ptr_arg) - возвращает размер переменной ptr_arg, которая является указателем. На 64-битной системе любой указатель (независимо от того, на что он указывает) имеет размер 8 байт. Поэтому len2 должно по идеи быть равно 8.
Моё почтение, сударь! Откуда у вас такие "глубокие" знания о размере указателя на 64-битных системах? Я новичок в программирование, но из предыдущих видео уважаемого автора этого канала понял, что размер указателя определяется при его объявлении типом данных, с которыми он будет работать, т.е. на которые он будет указывать. Поэтому я думал, что len2 должен был быть 2, т.к. short *ptr_ar; Следовательно, либо на 64-битной системе тип short занимает в оперативной памяти 4 байта, либо тут что-то наделал тип size_t при объявлении переменной len2? Странно, что сам автор на это никак не обратил внимание и не пояснил данный момент.
Я не встретил в видео упоминания (поправьте меня, если это не так) о том, что для всех указателей адрес увеличивается или уменьшается на величину, равную размеру объекта того типа, на который они указывают. Просто изначально я не понял, что за условная единица (или несколько оных) добавляется к указателю на массив ar (т.е. что она из себя представляет, 1 байт или 2, или больше?). Оставлю комментарий для таких же как я.
@@selfedu_rus может раньше? Адрес Арифметика, вроде, уже как была? Но из неё я почему-то не понял, что размер самой ячейки памяти (или регистра), в которой хранится сам указатель всегда одинаковый и зависит от разрядности ОС, под которую пишется программа. Поправьте меня, если я не прав.
Здравствуйте, можете пожалуйста, более подробно рассказать почему len_2 равна 4, я видел комментарий с таким же вопросом но там не очень понял ответ, так как знаю что Шорт размером в 2байта а значит и указатель на Шорт тоже 2 байта, спасибо!
@@powerri1992Да, 4 байта в данном случае(32 битная архитектура) - размер области памяти, которая отводится под указатель. На 64 битной - соответственно 8 байт отводится под хранение адреса. Попробуй написать printf("%zu", sizeof(short*)); printf("%zu", sizeof(short)); и сравни. Для удобства можно считать типами short*, double*, void* и т. д. Размер выделенной под указатель памяти не зависит от того, на какой тип он ссылается, а только от разрядности компилятора и ОС.
По поводу того, можно ли считать short* типом, есть мнение, что нельзя, так как short* a, b; a - указатель, b - обычная переменная(а мы предлагаем, что указатель). Для этого лучше объявлять указатели и обычные переменные на разных строчках, чтобы избежать путаницы.
Скажите, а почему конструкт short x = *prt_ar; не срабатывает как только добавляешь индексы в квадратных скобках, например при таком операторе short x = *prt_ar[2]; - компилятор уже выдает ошибку, как только добавляешь индексы в квадратных скобках звездочка уже на нужна?
Познавательно! Последняя фраза очень поразила меня и заставила задуматься, вот я, иногда, вместо 3 пишу 0b11, на деле это бессмысленно, ведь код становится нечитабельным и тут я показываю не свои познания в области информатики, а свою небрежность к коду, в итоге программа скомпилирует, почти одинаковый код. Кстати, спасибо за превосходный видеоурок!
Учитель от Бога!
Великолепный урок !!! Спасибо никогда не различал между указателем на массив и его указателем копией.
Классный урок!
хоть это показано, но я бы ещё добавил чуть более явное объяснение о логике поиска элемента массива (то что происходит при использовании среза и передачи ему индекса - 8:38) по формуле: +(*)
Спасибо. Я немного шокирован ) Мощь!
Огромное Спасибо! Я вообще ноль, и то все понятно. Очень хорошо объясняете
Отлично! Поскольку берется данные из ячейки, адрес которой есть просто сумма начального адреса (пусть, ptr_ar=106) и смещения (в данном случае=2), то получается, что мы берем данные из ячейки 106+2=108. И неважно, как мы это вычислили: 106+2 или 2+106.
Спасибо Вам за ваши уроки!
спасибо!👏👍💪
Сергей, здравствуйте. Почему len_2 равна 4? Шорт ведь двухбайтовые, для len_1 сходится 2*7=14, а вот со второй?
short *ptr_ar;
определяет указатель, который работает с данными типа short; здесь тип short относится не к указателю, размер указателей всегда соответствуют разрядности программы. Если она 32-х разрядная, то указатели занимают 4 байта. Именно это и отражено в ролике.
sizeof(ptr_arg) - возвращает размер переменной ptr_arg, которая является указателем. На 64-битной системе любой указатель (независимо от того, на что он указывает) имеет размер 8 байт. Поэтому len2 должно по идеи быть равно 8.
Моё почтение, сударь! Откуда у вас такие "глубокие" знания о размере указателя на 64-битных системах? Я новичок в программирование, но из предыдущих видео уважаемого автора этого канала понял, что размер указателя определяется при его объявлении типом данных, с которыми он будет работать, т.е. на которые он будет указывать. Поэтому я думал, что len2 должен был быть 2, т.к. short *ptr_ar; Следовательно, либо на 64-битной системе тип short занимает в оперативной памяти 4 байта, либо тут что-то наделал тип size_t при объявлении переменной len2? Странно, что сам автор на это никак не обратил внимание и не пояснил данный момент.
Я не встретил в видео упоминания (поправьте меня, если это не так) о том, что для всех указателей адрес увеличивается или уменьшается на величину, равную размеру объекта того типа, на который они указывают. Просто изначально я не понял, что за условная единица (или несколько оных) добавляется к указателю на массив ar (т.е. что она из себя представляет, 1 байт или 2, или больше?). Оставлю комментарий для таких же как я.
об этом дальше в адресной арифметике
@@selfedu_rus может раньше? Адрес Арифметика, вроде, уже как была? Но из неё я почему-то не понял, что размер самой ячейки памяти (или регистра), в которой хранится сам указатель всегда одинаковый и зависит от разрядности ОС, под которую пишется программа. Поправьте меня, если я не прав.
Здравствуйте, можете пожалуйста, более подробно рассказать почему len_2 равна 4, я видел комментарий с таким же вопросом но там не очень понял ответ, так как знаю что Шорт размером в 2байта а значит и указатель на Шорт тоже 2 байта, спасибо!
Или это именно размер вместимости самого места куда помещается адрес?
@@powerri1992Да, 4 байта в данном случае(32 битная архитектура) - размер области памяти, которая отводится под указатель. На 64 битной - соответственно 8 байт отводится под хранение адреса. Попробуй написать printf("%zu", sizeof(short*)); printf("%zu", sizeof(short)); и сравни. Для удобства можно считать типами short*, double*, void* и т. д. Размер выделенной под указатель памяти не зависит от того, на какой тип он ссылается, а только от разрядности компилятора и ОС.
По поводу того, можно ли считать short* типом, есть мнение, что нельзя, так как short* a, b; a - указатель, b - обычная переменная(а мы предлагаем, что указатель). Для этого лучше объявлять указатели и обычные переменные на разных строчках, чтобы избежать путаницы.
@@СамуилИгоревич спасибо
@@СамуилИгоревич спасибо
Спасибо
Спасибо вам! ar[idx] получается это своего рода синтаксический сахар)
да
Скажите, а почему конструкт short x = *prt_ar; не срабатывает как только добавляешь индексы в квадратных скобках, например при таком операторе short x = *prt_ar[2]; - компилятор уже выдает ошибку, как только добавляешь индексы в квадратных скобках звездочка уже на нужна?
Потому что ptr_ar[2] эквивалент записи *(ptr_arr+2) и мы не может ещё раз записать звёздочку, так как это уже тип int
Ребята, подскажите пожалуйста !
Как получить доступ к скрытому контенту )
укзатели это просто указатели , а не указатели на массивы