#27. Указатели. Приведение типов. Константа NULL | Язык C для начинающих
HTML-код
- Опубликовано: 26 сен 2024
- Практический курс по C/C++: stepik.org/cou...
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru...
Указатели для работы с разными типами данных. Присваивание адресов между указателями. Приведение типов между указателями. Предопределенная константа NULL.
Спасибо огромное за Ваш труд!
Замечательные объяснения!
Спасибо. Все понятно.
Спасибо
Балин, я уже с# учу, дали бы мне курс месяцев 7 назад(когда я учил си по курсам Гоши дударя) я бы учил бы си)
С 769 осторожно. Поведение будет зависеть от порядка хранения байт в памяти платформы , в Intel x86 это будет Little Endian
Когда курс на степике появится?
ПС: пните когда откроют, спасибо ^_^
Сергей, здравствуйте! может я что-то не уловил, но пока так и не ясен самый главный смысл , т.е. "сакральность" указателей. Ну можем мы работать с ячейкой памяти напрямую через указатель, можем через переменную и.....все? Или тема указателей еще не закрыта? Если что, заранее извиняюсь за нетерпение))))
да, это все еще впереди, когда речь пойдет о массивах и функциях, там они проявляются во всей красе ))
@@selfedu_rus спасибо за ответ!) тогда жду следующие лекции!
Спасибо большое за Ваш труд
Идёт уже второй урок, так и не понимаю, для чего указатели, без объявления переменной они не работают, при объявлении переменной в памяти итак выделяется место, тогда какую функцию несут указатели? Определить точное место куда мы будем записывать значение? Для подмена типа данных?
Спасибо большое за эту серию уроков. Можете пожалуйста поделиться тем, как запускается программа для отладки в VSCode, чтобы не компилировать каждый раз через gcc
Спасибо! Ставится точка останова и нажимаете Ctrl+Shift+D (у меня так, Run and Debug).
После С будут плюсы? Хотелось бы в таком виде просмотреть курс по Rust
плюсы же уже есть
@@Eugene-p2o О спасибо, не видел их, нужно просмотреть, тогда жду rust
8:17 значение - 769, код выполнился за 769 миллисекунд. Совпадение? 🤨
Друзья, а как все-таки правильно, нулл или налл ?) И еще, а что за зажигательный музон играет в конце каждого видео? Усидеть на месте, нереально! А видос познавательный, ждем еще.
Если по-английски то НАЛ
Если по-немецки то НУЛь
@@segeus а по китайски вроде вот так - 空值 .
А можно вопрос, откуда вы учились у Си? Просто после вашего курса я хочу еще почитать литературы, в том числе и Книга Герберта Шилдта "Си, полное руководство, классическое издание", и там можно создать свой ЯП, или мне еще придется читать литературу?
Сложно мне ответить на ваш вопрос. Просто я его 20 лет назад осваивал и потом много использовал в проектах (правда там был С++, но не суть). Сейчас, чтобы все детали верно озвучивать, ориентируюсь на книги Стивена Пратта и Столярова Искусство программирования.
18 недоступных видео скрыто. это как?
Ответ на вопрос чем плохи переменные будет дальше?
да
int это же 2 байт илм 16 бит, а увас 4 байта. Как так? .
в 32 и 64-разрядных системах, как правило, 4 байта
@@selfedu_rus т.е. не обязательно, по-желанию.
@@1975nacgulпо желанию чьему? Нужно по-разному смотреть на каждую систему
Почему сразу так не сказать?..Вся тема в нескольких основных тезисах: (извините, я конспект пишу за Вами на английском)
Pointers are designed to write and read data from any memory cells and store theirs addresses with data.
They are denoted witn the sign '*', for example, as
'char *gpt' and divided into the following variable types:
char *gpt; (memory area - 1 byte),
int *gpt; (memory area - 4 bytes),
double *gpt; (memory area - 8 bytes).
The pointers in OSx86 - is allocated 4 bytes of memory;
in OSx64 - is allocated 8 bytes of memory.
Pointer notation construction:
chat d = 10; memory allocation operation for the variable 'd';
char *gpt; declaration of pointer for working with data type 'char';
gpt = &d; assignment operation of value 'd' to pointer 'gpt';
char x = *gpt; value read operation from memory cell of variable 'd';
*gpt = 100; value write operation to memory cell of variable 'd';
short *a, *b, *c; declaration of 3 pointers in one data type.*/
General expression type 'void *' is used to save adresses of variables, but it is not to use with memory cells (*p = 10; : error: invalid use of void expression);
Pointers. Practice problems:
- when pointer refers to an unallocated memory area and
some value is bieng written.
- when memory is in a program dynamically allocated
(by using 'malloc'function) and not freed (memory leak).
Example:
//int arg = 5;
//int *ptr = NULL; //NULL is equivalent to &arg, int *ptr = &arg;
//If(ptr != NULL)
// *ptr = 1;
// А у Вас столько слов на три видео растянуто и в итоге голова кругом и сложнее для понимания ...
Так и не объяснил для чего нужны указатели, работать с адресом ну да, а какой от этого толк, ни один программист не может толком объяснить, такое ощущение что всем сказали писать эмперсанд арк и все пишут, то-ли не знают то-ли не понимают просто пишут звёздочку и эмперсанд
об этом дальше, когда дойдем до функций, также будет пример с динамическим массивом
В примитивных программах в целом то и не нужны. Банально любую структуру данных без указателей не реализовать
объясните пожалуйста тупому (6:57) в какой системе счисления 777 = 9 + 256 *3 (запись в байтах 9 3 0 0) и 769 = 1 + 256 *3 (запись в байтах 1 3 0 0). В шестнадцетиричной системе должны быть цифры 777(запись в байтах 0 3 0 9) и 769 (запись в байтах 0 3 0 1). Не могу разобраться
Ну смотрите, integer - это 4 байта (в данном случае). В шестнадцатиричной системе 0x 00 00 03 09. Представление в памяти идет с младшего байта к старшему, т.е. 0x 09 03 00 00, в отличии от привычной записи. Ну и следует отметить, что в шестнадцатиричной системе один разряд - это 4 бита. Заменив значение 4 бит на значение байтов получим 9300, т.е 09=9, 03=3, 00 =0. Отвечая на ваш вопрос - это или десятиричная или шетнадцатеричная система - для одного байта - это неважно, так как значения (9 и 3) не превышает 9.
Что касается выражений 777 = 9 + 256 *3 и 769 = 1 + 256 *3 это типа 256 битной системы счисления, т.е. основание 256 - т.е. диапазон одного байта, а далее каждому разряду соответствует степень основания, младшему 9 - 0 степень, т.е. 9 * 256 ** 0, следующему 3 - 1, т.е. 3 * 256, следующему 0 - 2 степень, т.е. 0 * 256 *256 и так далее. Как в любой позиционой системе счисления.
Немного добавлю парня выше. Информацию в памяти можно представлять в двух последовательностях: big endian и little endian. В случае с примером Сергея у него little endian машина как и большинства. Это означает что младшие **байты** идут первыми.
Наглядный пример: 2048
2048 в двоичной системе исчисления 0000 1000 0000 0000. В 16ричной системе 08 00. Тут 08 это старший **байт**, следовательно 00 младший **байт**.
В случае с little endian компьютер сохранит 08 00 как:
00 08.
Здраствуйте,спасибо за инфо,хотелось в будущем вин апи
спасибо!👏👍