Вы видите копию треда, сохраненную позавчера в 11:53.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Уже и с ИИ пытался, и на ютабе смотрел.... Ничего не ясно.
Мб есть какая-то простая аналогия? Как эту шнягу воспринимать?
Есть у нас переменная, нахуй нам указатель, если уже есть, на что ссылаться?
>Есть у нас переменная, нахуй нам указатель, если уже есть, на что ссылаться?
Значение переменной в памяти, память по адресу, адрес есть указатель. Начни с Ассемблера, это база.
Ты тролляка чтоль? Что за глупость спрашиваешь.
Указатель - это переменная типа "адрес". Она хранит в себе адрес памяти. Сделай
int *p;
sizeof(p);
У тебя покажет цифру 8. Потому что адреса обычно 8 байт, 0xffaabbcc.
p = &a
Соответственно присваиваешь адрес переменной "a" в переменную "p". Теперь если записать что-то по адресу который сохранен в "p", то будет у тебя это записано в переменную "а"
Ну блин, ты бы почитал книг по синтаксису С перед тем как программировать. А то тут много чего есть с чем впервые столкнёшься.
Ууу бля! Какая же тебя веселуха ждёт когда столкнёшься с указателями на указатели, указателями на многомерные массивы, указателями на функции, указателями на указатели указателей...
>Есть у нас переменная, нахуй нам указатель, если уже есть, на что ссылаться?
1) В С передача аргументов функций идет по значению. Например у тебя есть функция
int add(int x, int y) { return x + y }
пусть у тебя есть переменные в основной программе a, b, когда ты вызовешь
int c = add(a,b), то программа, перейдя к телу функции, создаст локальные переменные x,y и загрузит в них значение из a,b. То есть функция выглядит на самом деле примерно так
int add( FIRST, SECOND ) { int x = FIRST; int y = SECOND; return x + y }
она твои оригинальные переменные не трогает, лишь копирует значение из них.
Тем самым передавая переменные в функцию, ты создаешь их копии! И тут есть несколько проблем
i) Представь у тебя есть жирная структура, передавая её в функцию, тебе придется копировать кучу данных, что трудозатратно.
ii) Представь ты хочешь написать функцию, которая должна менять переданную переменную. И ты не можешь это сделать, потому что все действия с переменной внутри функции происходят с её копией.
Поэтому используют указатели. Представь есть функция
void swap( int x, int y ), она должна поменять значения в x, y местами.
Передав в неё a, b, ты сделаешь их копии, и поменяешь значения в копиях, не то что тебе нужно. Но если
void swap (int x, int y) и ты вызовешь swap(&a, &b) в мейн программе
то функция сделает копии указателей. Но эти копии всё так же указывают на оригинальные a, b, и поэтому ты можешь влиять на них находясь внутри функции!
В общем, если у тебя есть переменная A, и ты хочешь поменять её внутри функции, тебе нужно, тчобы функция принимала указатель на А. Пусть например у тебя есть строка char a, ты хочешь указатель на начало строки поменять внутри функции, тогда ты в функую должен передать указатель (начало строки) = указатель (указатель a), получается знаменитый указатель на указатель.
Так же указатели решають проблему i), передав вместо структуры указатель на неё, у тебя скопируется не вся структура, а лишь указатель на неё, который меньше самой структуры в десятки раз.
2) Когда ты хочешь сделать что-то динамическое. Представь ты хочешь сделать датабазу, которая может расти/уменьшаться, пользователь может в неё добавлять значения во время работы программы.
Ты очевидно объявишь массив, типа int a[100]. Но тут будет проблема, что ты заранее не знаешь, какого размера у тебя должна быть база. Объявишь много, большая часть будет пустая. Объявишь мало, не влезит информация. Тебе нужно динамически, во время работы программы, создавать переменные. Тебе нужно написать функцию, "создающую" переменные.
Ты можешь написать функцию, выдающую числа int getNum() { return rand() }, аналогично ты можешь написать функцию, выдающую поинтеры int getP() { return (int*)malloc(sizeof int) }, malloc у ос просит отдать кусок памяти величиной под один int, и возвращает указатель на начало блока в деталях не совсем так, но не важно. И в этот блок ты можешь записать своё число. Вуаля, ты научился создавать переменные динамически. В твоей основной программе может быть вечный цикл, читающий ввод, и если вводишь 'add' он вызывает getP() и создает переменную во время работы программы, в сурс коде её не было.
>Есть у нас переменная, нахуй нам указатель, если уже есть, на что ссылаться?
1) В С передача аргументов функций идет по значению. Например у тебя есть функция
int add(int x, int y) { return x + y }
пусть у тебя есть переменные в основной программе a, b, когда ты вызовешь
int c = add(a,b), то программа, перейдя к телу функции, создаст локальные переменные x,y и загрузит в них значение из a,b. То есть функция выглядит на самом деле примерно так
int add( FIRST, SECOND ) { int x = FIRST; int y = SECOND; return x + y }
она твои оригинальные переменные не трогает, лишь копирует значение из них.
Тем самым передавая переменные в функцию, ты создаешь их копии! И тут есть несколько проблем
i) Представь у тебя есть жирная структура, передавая её в функцию, тебе придется копировать кучу данных, что трудозатратно.
ii) Представь ты хочешь написать функцию, которая должна менять переданную переменную. И ты не можешь это сделать, потому что все действия с переменной внутри функции происходят с её копией.
Поэтому используют указатели. Представь есть функция
void swap( int x, int y ), она должна поменять значения в x, y местами.
Передав в неё a, b, ты сделаешь их копии, и поменяешь значения в копиях, не то что тебе нужно. Но если
void swap (int x, int y) и ты вызовешь swap(&a, &b) в мейн программе
то функция сделает копии указателей. Но эти копии всё так же указывают на оригинальные a, b, и поэтому ты можешь влиять на них находясь внутри функции!
В общем, если у тебя есть переменная A, и ты хочешь поменять её внутри функции, тебе нужно, тчобы функция принимала указатель на А. Пусть например у тебя есть строка char a, ты хочешь указатель на начало строки поменять внутри функции, тогда ты в функую должен передать указатель (начало строки) = указатель (указатель a), получается знаменитый указатель на указатель.
Так же указатели решають проблему i), передав вместо структуры указатель на неё, у тебя скопируется не вся структура, а лишь указатель на неё, который меньше самой структуры в десятки раз.
2) Когда ты хочешь сделать что-то динамическое. Представь ты хочешь сделать датабазу, которая может расти/уменьшаться, пользователь может в неё добавлять значения во время работы программы.
Ты очевидно объявишь массив, типа int a[100]. Но тут будет проблема, что ты заранее не знаешь, какого размера у тебя должна быть база. Объявишь много, большая часть будет пустая. Объявишь мало, не влезит информация. Тебе нужно динамически, во время работы программы, создавать переменные. Тебе нужно написать функцию, "создающую" переменные.
Ты можешь написать функцию, выдающую числа int getNum() { return rand() }, аналогично ты можешь написать функцию, выдающую поинтеры int getP() { return (int*)malloc(sizeof int) }, malloc у ос просит отдать кусок памяти величиной под один int, и возвращает указатель на начало блока в деталях не совсем так, но не важно. И в этот блок ты можешь записать своё число. Вуаля, ты научился создавать переменные динамически. В твоей основной программе может быть вечный цикл, читающий ввод, и если вводишь 'add' он вызывает getP() и создает переменную во время работы программы, в сурс коде её не было.
Забыл что звездочки за разметку отвечают.
>void swap (int ✨x, int ✨y) и ты вызовешь swap(&a, &b) в мейн программе
>выдающую поинтеры int✨ getP() { return (int✨)malloc(sizeof int) }
Хуя се как гидно, я другой аноний, Си мне не нужен, я вкатун в пи эйч пи и жабовый скрипт. Но в МухГУ на первом курсе проходили основы Си. Я уже забыл про то, что такое указатели. Тут прочитал и ад вспомнил прослезился.
Указатель это просто циферки, буквально. Говорит что вот тут лежит хуйня которую следует считать такого типа, мамой клянусь.
Иди нахуй, неуч. Я написал это только чтобы макнуть тебя в унитаз ментально.
Не за что. Правда часть про динамическое выделение памяти я хуего написал, да и про передачу аргументов всратовато.
Сейчас бы дописал небольшой экскурс в историю, что раньше можно было писать куда угодно, но можно было бы случайно перезаписать важное. Тогда память стали разбивать на блоки, чтобы такого не случилось. А позже начали эту работу автоматизировать, так появились менеджеры-памяти, которые затем мутировали в ОС. И прося память у ОС, она, очевидно, не может выдать ничего, кроме адреса начала блока.
Крч, если коротко: ты либо относишься к категории людей, которая понимает указателиk либо ты их никогда в жизни не поймешь
Для этого заходишь на сайт Андрея Столярова http://stolyarov.info/books и открываешь 2 книги (Не обязательно их все читать!!!):
1) Программирование: введение в профессию. Том 1: азы программирования - http://www.stolyarov.info/books/pdf/progintro_vol1.pdf
2) Программирование: введение в профессию. II: низкоуровневое программирование - http://www.stolyarov.info/books/pdf/progintro_vol2.pdf
В первой книге открываешь страницу 350 и читаешь главу "2.13 Адреса, указатели и динамеческая память". В этой книге он рассказывает про указатели на примере Паксаля(он тебе нахуй не нужен, тебе нужно понять суть указатель на более простом языке!!!)
Во второй книге открываешь стр 251 и читаешь главу "4.4 Указатели, массивы, строки" и ещё стр 393 главу "4.13 Ещё об указателях". Тут уже идет C и подробное описание всего устройства этой хуйни(указателя)
Без рофлов - это буквально самый подробный способ понять что это за хуйня, как она работает и как её юзать даже не думая о том что это такое.
Если, перечитав все 3 главы по 5 раз и попрактиковавшись с кодом, и чатомГПТ, ты нихуя не понял - то буквально сдайся (Я НЕ ШУЧУ). Это криптонит, который ты и другие челы не смогут никогда понять, или смогут лишь понимать, как это работает на уровне тупого заучивания, а не осмыслено и без задней мысли юзать, когда надо
Можешь смотреть заумные книжки, а можешь поискать четырехкнижник Полякова по языку c. Там очень просто все даётся. Суммарно там не больше 220 страниц.
Чтобы понять указатели, надо представлять себе как работает компьютер. Что все данные, которыми оперирует процессор должны располагаться в ОЗУ. И причём эти данные лежат по каким-то конкретным адресам адресного пространства.
Ну и значит, раз есть адреса - можно значения этих адресов тоже сохранять где-то в памяти. Эти значения тоже будут данными. Которые зовутся указателями.
Длина указателя аппаратно зависима. В современных процессорах x86 в 64-битном режиме - очевидно 8 байт.
x86 в 32-битном режиме оперировали 4-байтными указателями.
В Z80, когда размер адресного пространства всего лишь 64 КБ, длина указателя 2 байта.
Под x86, DOS программы оперировали в сегментированном адресном пространстве, где длина сегмента 64 КБ, но сегменты могли различаться, перекрывали друг друга. И поэтому DOS программы различали "простые" 16-битные указатели и FAR указатели, размером 32 бита. Насколько помню, в FAR указателях хранился ещё и код сегмента, помимо смещения в самом сегменте.
И значит, дескрипторы сегментов под x86 в 16-битном реальном режиме процессора хранились в регистрах CS, DS, SS и иже с ними. Чтобы обратиться к адресу в другом сегменте нужно было сменить содержимое этого регистра, а только потом лезть по нужному адресу.
Пусть он попрограммирует под DOS с этой чехардой FAR и простых указателей. Или под Windows 3.11
Напоминаю, что DOS программы по-дефолту обитали именно в 16-битном реальном режиме x86 процессора. И именно в реальном режиме все x86 процессоры начинают свою работу при включении или reset-е.
>x86 в 32-битном режиме оперировали 4-байтными указателями.
x86 процессоры обрели 64-битный режим только в 2004 году, с выходом AMD Athlon 64 ЕМНИП. До этого, начиная с 80386, выпущенного в 1985 году (кажется), x86 максимум поддерживали 32-битный режим работы. В т.ч. Intel Pentium-ы 1, 2, 3.
Господи, до чего пиздатыми были те времена. Двухтысячный год, модем вместо интернета, никаких ебливых ллм. Программирование учили по книжечкам блядь, по Кнуту и Страуструпу.
На кой хуй это все, сраные расты эти с котлинами, дэдэдэ ебаное в рот, гексагональные архитектуры. Ортогональная блять у меня архитектура, я прямоходящий перпендикулярно полу. Макаки сраные, как я вас всех ненавижу блять.
Я бы вообще рассматривал несколько разных периодов, исходя из реалий в России. Как жили, чем дышали, что видели люди. Что было на повестке дня.
1. Период с 1999 по 2002 или 03 года (может быть) где-то. Это уже после дефолта 98 года. Рубеж нулевых.
Наверное, 03 год идёт до вторжения США в Ирак, пожалуй.
2. Сами нулевые, классические. 2003-2006 годы
3. 2007-2009 года. Там и пик нефтяных цен, и кризис в США 2008 г. и то что после него. Сначала был самый смак нулевых, а потом отходняк после кризиса
4. С 2010 по 2014 год, до Крымнаша и Донбасса. Уже не нулевые, но хорошие, тучные времена
Ну а дальше не будем. Всё и так известно.
И вот это деление времени на периоды куда более правильное, нежели чем тупо хронологически по десятилетиям.
Хотел бы ещё увидеть такое деление на годы СССР, начиная с конца ВОВ, и до 1991 года. Если кто знает, отзовитесь.
А главное, тогда не было такого засилья компьютеров, как сейчас. Не было ебучих смартфонов. Про цифровой детокс никто и не помышлял.
И это вообще был только расцвет компьютерной эры. Всё только начиналось. Компы были уже куда мощнее чем в 90-е, но всё равно чем-то прогрессивным. А не обыденным элементом обстановки как сейчас. Но и не настолько в новинку, как в 90-е. Года 1996-1998. А до года 1995 компы вообще были чем-то супер неизвестным. И просто охуеть. Американской диковинкой.
Люди бумажные книжки читали, газеты выписывали. А не с экранов и в интернете как сейчас.
>Аноны, подскажите, как в Си понять указатели?
1) Указатель на конкретный тип - тип, в первом приблежении считай, что указатели на разные типы являются разными типами.
2) У указателя есть операция взять значение, у всякого значения есть операция получить указатель.
3) Каждый указатель сравним со специальной константой (null pointer constant)
Минимальная база, которую ты должен усвоить, чтобы понять указатели.
>гексагональные архитектуры
>расты котлины
Каждый раз даюсь диву что люди которые (якобы) выучили с / с++ матюгаются с таких элементарных концепций которые любой сенька из бик кека осваивает на пару часов.
Я считал себя немного недопрограммистом из-за того что писал фронтенд и вернхний слой бекенда (крудошлепство) на всяких скриптовых языках и считал что сишники вот тру вещами занимаются, которые мне лень осваивать и для которых я недостаточно хардкорен. Но вот недавно перешел в команду где в том числе больше общаюсь с сишниками и понимаю что половина этого народа супер недалекие код макаки которые даже не хотят рости из кодинга в полноценных инженеров с пониманием общей картины. Пока средний веб кодер осваивает за 10 лет весь стек вглюь плюс менеджмент плюс аналитику плюс жохуя еще всего вокруг, сишники просто дрочат свои делегаты и указатели по 20 лет с важным видом. Я в ахуе
>>41438
Ну дык сишные байтоебы на сегодняшний день неиронично занимаются лишь низкоуровневой разработкой вследствии комплексности современной архитектуры. Это раньше в 80-90х они могли разработать чуть ли не целую OS уровня Win3.1 на одном голом Си и АСМе, а сейчас же из-за обилия абстракций и различных спецификаций, большинство проектов пишется на языках более высокго уровня. Си остался только для базовых вещей - низкоуровневой оптимизации 4% узких мест проекта, драйверов, ебли с ядром, самых простейших эмбеддед задач (что-то комплексное уже переносится к уровню выше - c++ и rust). Там где нужна комплексная архитектура с учетом требований рынка, на байтоебиков забивают хуй и берут джавистов, шарперов, гошников, плюсовиков с современными стандартами языка (ибо c++ 98 это буквально тот же си относительно современных задач).
Я до сих пор встречаю на голову больных байтоебов, которые продвигают свои больные инициативы по типу "LET'S REWRITE THE WORLD", которые призывают использовать хардкорные байтоебские архитектуры для написания сайтов и программных проектов, и похуй что их наркомания по итогу лишь сделает проект менее конкурентоспособным, замедлит разработку проекта в 10 раз, бесмысленно приведет к удорожанию бюджета проекта в 30 раз, сделает итоговый проект менее обслуживаемым и более сложным в исправлении багов и добавлении новых фич, а внешний фид фронта проекта вообще будет говном из нулевых.
Это кстати одна из причин почему японцы так сосут в современной разработке ПО. Это буквально нация-байтоеб, которые из-за своей инженерной высокомерности считают ненормальным использовать сложные абстракции. У них неиронично в 2026 году можно увидеть сайт местного банка с бэкендом на C++ 98, а с фронтом уровня Web 1.0. Они на любое замечание о том, что нахуя делать фичу <фичанейм> на уровне железа, если её можно сделать на уровне кода, уходят в визг и говорят Я ИНЖЕНЕР Я ЛУЧШЕ ЗНАЮ.
Поэтому предел Си пердолей - ретро разработка под старые платформы типо Amiga, ZX Spectrum, PS1, эмбеддед (а реально сложные эмбеддед проекты пишутся уже на современном С++, фронт пишется на чем-то более высокоуровневом)
>>41438
Ну дык сишные байтоебы на сегодняшний день неиронично занимаются лишь низкоуровневой разработкой вследствии комплексности современной архитектуры. Это раньше в 80-90х они могли разработать чуть ли не целую OS уровня Win3.1 на одном голом Си и АСМе, а сейчас же из-за обилия абстракций и различных спецификаций, большинство проектов пишется на языках более высокго уровня. Си остался только для базовых вещей - низкоуровневой оптимизации 4% узких мест проекта, драйверов, ебли с ядром, самых простейших эмбеддед задач (что-то комплексное уже переносится к уровню выше - c++ и rust). Там где нужна комплексная архитектура с учетом требований рынка, на байтоебиков забивают хуй и берут джавистов, шарперов, гошников, плюсовиков с современными стандартами языка (ибо c++ 98 это буквально тот же си относительно современных задач).
Я до сих пор встречаю на голову больных байтоебов, которые продвигают свои больные инициативы по типу "LET'S REWRITE THE WORLD", которые призывают использовать хардкорные байтоебские архитектуры для написания сайтов и программных проектов, и похуй что их наркомания по итогу лишь сделает проект менее конкурентоспособным, замедлит разработку проекта в 10 раз, бесмысленно приведет к удорожанию бюджета проекта в 30 раз, сделает итоговый проект менее обслуживаемым и более сложным в исправлении багов и добавлении новых фич, а внешний фид фронта проекта вообще будет говном из нулевых.
Это кстати одна из причин почему японцы так сосут в современной разработке ПО. Это буквально нация-байтоеб, которые из-за своей инженерной высокомерности считают ненормальным использовать сложные абстракции. У них неиронично в 2026 году можно увидеть сайт местного банка с бэкендом на C++ 98, а с фронтом уровня Web 1.0. Они на любое замечание о том, что нахуя делать фичу <фичанейм> на уровне железа, если её можно сделать на уровне кода, уходят в визг и говорят Я ИНЖЕНЕР Я ЛУЧШЕ ЗНАЮ.
Поэтому предел Си пердолей - ретро разработка под старые платформы типо Amiga, ZX Spectrum, PS1, эмбеддед (а реально сложные эмбеддед проекты пишутся уже на современном С++, фронт пишется на чем-то более высокоуровневом)
>япония
Кстати показательный пример. В итоге они жидко пукают когда китайский конкурент (у которого еще и сотрудников в разы меньше чем у японского пердоли корпорейшн) забирает 80% аудитории японского рынка. Немецкие компании тоже этим страдают, только там конкурент дерманцам - американские стартапы.
В современную комплексную архитектуру с несколькими слоями абстракций они не могут и не умеют. Их нужно сослать в музей и показывать как пример китайских писателей традиционной живописи 16 века. Красиво, сложно, не каждый может повторить, учиться такому искусству долго, но в современных реалиях такое искусство бесмысленно кроме хобби целей.
Да, в том числе. Но он не единственный. На западе такие тоже встречаются временами. Может это обида из-за того, что они теперь менее востребованы чем раньше, хз
Си - это дзен, познать который дано не каждому.
>>41449
>Я до сих пор встречаю на голову больных байтоебов, которые продвигают свои больные инициативы по типу "LET'S REWRITE THE WORLD"
Так це ж растоблядки.
>>41451
>несколькими слоями абстракций
Джавапидор из тырпрайза, сейчас бы на си твои абстрактные фабрики писать лол.
Зачем вы вспоминаете шиза столярова, когда упоминаете проекты на си?
>Джавапидор из тырпрайза, сейчас бы на си твои абстрактные фабрики писать лол.
Так современные паттерны тырпрайза благодаря нескольким слоям абстракции позволяют значительно экономить время на разработку и бюджеты проектов. Рынок порешал твоих байтоебиков.
>Так це ж растоблядки.
Про Столярова и его орду фанатиков мы уже забыли?
Как ловко джаваблядок прикинулся пидоруном из техникума, которого не обучали чтению.
Чини детектор, шизик. Сам то че на Си пишешь годного? Или ты неосилятор без реального портфолио? Я вот бывший разработчик firmware с дипломом магистратуры по радиосвязи и обработке сигналов, писал и на Си и на Плюсах, даже в разработке военке участвовал, пока ИТТ ты вебдрисню писал.
механизмы косвенной адресации в яп в первую очередь нужны для реализации сложных (динамических) структур данных, так же нужна для реализации полиморфного поведения, для гетерогенных коллекций, для эффективной передачи аргументов (без копирования),
>пук
Нихуя себе, тут целая макака-заливатор прошивки в ардуину нарисовался с дипломом говновуза.
>ардуино
Мы все рады за тебя, за твои проекции и твой опыт работы с ардуино и конструкторами по электронике для детишек, но нам зачем об этом знать?
>уиии везде ардуинодебилы
Зачем ты проецируешь свой пердолинг с ардуинкой на других людей? С чего ты вообще взял что я упоминал Ардуино?
>сделает проект менее конкурентоспособным, замедлит разработку проекта в 10 раз, бесмысленно приведет к удорожанию бюджета проекта в 30 раз, сделает итоговый проект менее обслуживаемым и более сложным в исправлении багов и добавлении новых фич, а внешний фид фронта проекта вообще будет говном из нулевых
Неконкурентоспособными поделия на высокоуровневых абстракциях сделала как раз "скорость разработки" и "внешний фид".
Тело авторизуется в очередном "уникальном саас-сервисе по перекладыванию джейсонов", видит там привычную картину "внешнего фида" и закрывает, ибо ебало оно в рот этот ваш "современный ux/ui". Он неудобен, он косой, кривой и тормозной одновременно, как уголки у кнопок не скругляй.
Вы видите копию треда, сохраненную позавчера в 11:53.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.