Язык Си с нуля - Урок 26 - Указатель на указатель
Вставка
- Опубліковано 16 жов 2024
- Это видео для тех, кто еще ни разу не программировал, но прошел предыдущие 25 уроков.
В данном уроке мы изучим:
указатели на указатели
как их использовать
► Плей лист - • Программирование на Си...
Уроки по теме:
► урок 2 - Вывод на экран - • Программирование на Си...
► урок 3 - Условный оператор и операторные скобки - • Программирование на Си...
► урок 16 - Приведение типов - • Язык Си с нуля - Урок ...
► урок 21 - Указатели - • Язык Си с нуля - Урок ...
► урок 22 - Передача параметров по указателю - • Язык Си с нуля - Урок ...
► урок 24 - Виды указателей - • Язык Си с нуля - Урок ...
Язык Си с нуля - данный видеокурс предназначен для тех, кто еще ни разу не программировал. Здесь я максимально понятно пошагово объясняю основы программирования на языке Си. Если хотите научиться программировать на языке Си - пройдите весь курс. Помимо объяснения материала я даю домашку. А после каждых нескольких уроков мы вместе пишем забавные игры!)
Спасибо тебе добрый человек! Доходчиво и лаконично объясняешь, то что надо!
Вау. Почему у инфо цыган типо Гоши или Хауди вся аудитория ( вот где лежит годнота, давно искал
@MrDixioner спс за инфу, пойду отпишусь от Хауди и сюда присоединюсь
Кто ещё за завяли и Гоша?
Огромное спасибо за урок)
Где же ты раньше был))) Спасибо большое тебе за уроки)
Съел за тебя шоколад! Надеюсь поддержал.
ОГРОМНОЕ СПАСИБО ЗА УРОКИ!
Круто! Респект! Действительно годный материал)
уроки ШИК!
Спасибо!
Звук крутой, на что записываешь?
USB микрофон Recording Tools MCU-01 Black
ты лучший
Здравствуйте
Подскажите почему через указатель на указатель можно изменять значение только в первой ячейке памяти (под индексом 0) а в остальных не получается ? Выскакивает Segmentation fault.
То есть
void CreateInt (int **p)
{
*p = malloc(3 * sizeof(int));
**p = 8; //Значение смениться в 0 ячейке указателя *a
*p[1] = 5; //Значение не меняться , выходит ошибка Segmentation fault
**(p + 2) = 11; ////Значение не меняться , выходит ошибка Segmentation fault
}
комментарий
указатели на указатели как их использовать
Аааааааа я перегорел)) указатель, на указатель, указателя, который указывает на указатель указателя)) в паскале, мне кажется проще все выраженно. может дело привычки а может я тупой)))
Нормально, что я не понимаю это все с первого раза ? И такой вопрос: если у нас есть *а, то есть какая то ячейка "а", на которую он указывает? Если у нас есть **р2 (при условии, что мы не присваивали указателю никакого адреса), то это значит, что он указывает на *р2 (или что будет, тогда, такое *р2 относительно **р2), а это, в свою очередь, на р2? (Если ты это объяснял уже, то, видимо, я не заметил. Извини)
Когда мы создаем *а, то у нас есть только ячейка памяти с адресом, т.е. *а. Чтобы *а указывала на "а" надо присвоить адрес другой переменной или выделить память.
**р2 - это просто указатель на другой указатель. При этом создается только ячейка памяти с адресом. Т.е. *р2 и р2 при этом не создано.
@@beginend95понял, спасибо большое )
Спасибо за уроки!
Почему если в функцию void CreateInt (int **p), передать не указатель на указатель **p, а просто указатель *p, то есть вот так - void CreateInt (int *p), то код работает так же?
потому что нам достаточно одного перехода по адресу, а второй переход, который и позволяет указатель на указатели мы не используем
Спасибо.
@@АлексейАлексеев-ц8х9т
Священные знания. Долго пытался изменить значение указателя из другой функции пока не наткнулся на указатель на указатель.)))
со второго раза разобрался. В аргументе функции CreateInt избыточен указатель на указатель **p, достаточно обычного указателя *p, так как нам не нужен доступ дальше значения указателя *a
Там если передавать в функцию в качестве входного параметра просто указатель, то получается, что функция должна изменить входной параметр. Если передать указатель указателя, то функции придётся изменить опять же указатель.
В первом случае(я хз почему, но оно так) функция не сможет этого сделать, потому что она не может напрямую изменять значение входного параметра. Не знаю почему, но я пробовал это делать с другой функцией, которой передавал в качестве параметра обысную переменную, которую пытался изменить(присвоить ей др значение). И она не изменялась
Такие дела
широкую на широкую!
Где лучшие уроки?
У Антохи!
Из этих всех уроков я не понял только одного: нафиг эти указатели вообще нужны? Зачем какие-то адреса в памяти, а тем более адреса на адреса в памяти....? Нафига городить такой огород, если можно просто передавать по значению и вообще не задаваться вопросом о том, в какой области памяти что лежит?
Например, есть функция, которая что-то делает с твоей структурой и изменяет ее поля. Ты создал структуру и передаешь в эту функцию указатель на эту структуру и внутри функции все меняется и после нее у тебя в коде уже измененная структура.
А иначе, если передаем "значение", т.е. всю структуру целиком, то:
1) во время передачи в функцию создается копия структуры, которая передается в функцию
2) внутри функции с этой копией что-то делается и присваивается
3) мы возвращаем из функции также целую получившуюся структуру и должны будем еще раз присвоить уже ее значения нашей первой структуре
..
а если у нас структура большая.. и там 20 полей да еще со своими структурами..
Вывод: нужно для того, чтобы программы работали гораздо быстрее. Я бы назвала это как основное их использование.
Указатель на указатель это конечно взрыв мозга, кто-нибудь может прокомментировать правильно ли сделаноЖ
#include
#include
void CreateInt(int **p)
{
if (p !=0)
{
free(*p);
*p = NULL;
}
}
int main()
{
int z = 100;
int *a = NULL;
a = &z;
*a = 200;
printf("Before magic! adress %d, number %d
", a, z);
CreateInt(&a);
printf("Some magic! adress %d, number %d
", a, z);
return 0;