Начинающий проффесионал
Заинтересовался программированием, оч хочется создавать полезные штуки! Лига программистов помогите, да посоветуйте чего нибудь!
Заинтересовался программированием, оч хочется создавать полезные штуки! Лига программистов помогите, да посоветуйте чего нибудь!
Тема указателей для многих является той точкой, на которой многие новички спотыкаются. Секрет такого ступора объясняется довольно просто, из мира языка С++ Вы погружаетесь в мир архитектуры компьютера и выполнения программ. Поскольку Вы его не знаете и почему-то авторы книг/курсов/статей не хотят Вас с ним знакомить, этот процесс может проходить довольно болезненно. В данном статье мы попытаемся устранить этот недостаток.
Любая программа перед тем как начать исполняться полностью загружает свой код в ОЗУ или проще говоря оперативную память. Оперативная память в урощенной схеме представляет из себя таблицу адресов и значений.
Есть такой термин как разрядность и применяется он для ОС, шины, адресного пространства. Он означает, сколько одновременно бит может обработать устройство. Вот один из примеров оперативной памяти с адресной разрядностью в 8 бит(2^8 = 256 адресов) и разрядностью шины 16 бит.
Давайте посмотрим на примере простой программы, как это может работать в упрощенной схеме.
После того, как компилятор пройдется по вашему коду, он заменит все ваши имена переменных на адреса и заполнит как-то так оперативную память
Соответсвенно адрес у переменной не меняется и если мы присвоим ей новое значение, то оно изменится только в столбце "значение по адресу".
Вот мы и подошли к самому главному - указатель, это совершенно обычная переменная которая хранит АДРЕС. У нас есть переменные, которые хранят числа, которые хранят буквы, которые хранят строки. А теперь просто появились переменные, которые хранят адрес.
Что бы ОБЪЯВИТЬ указатель, достаточно указать перед именем переменной звездочку. Это даст понять, что в этой переменной вы будете хранить адрес определенного типа. На самом деле хранение в памяти значений намного сложнее, поэтому компилятору надо знать тип хранимого адреса, что бы правильно его получить из памяти.
Для работы с указателем используются две новые операции.
& - взятие адреса у какой-либо переменной
* - получение значение по адресу в указателе
Если Вы будете держать в голове эту простую схему с оперативной памятью, то указатели будут даваться Вам намного легче.
Удачи в обучении.
Для жаждущих продолжения =)
В продолжении http://pikabu.ru/story/programmistyi_na_c__samyiy_bolshoy_ra...
и http://pikabu.ru/story/yazyik_programmirovaniya_c_inostranny...
В конечном итоге сегодня суд постановил:
"Оставить решение суда без изменения, жалобу без удовлетворения".
Антимонопольная служба с апелляцией обломалась, суд остался на стороне организации и ЯП "С++" иностранным языком не признал, а многие надеялись ;)
Инкремент (i++) эта такая фиговина, которая:
увеличивает вашу переменную без регистрации и смс ©Jereli
И это круто, но не без детских грабель, а точнее следует отличать постфиксную (i++) и префиксную (++i) формы.
PS: К слову, декремент (i--), он как инкремент, только наоборот – не дает, а отбирает. Так, что и грабли у них, если не одинаковые, то бьют по одному и тому же месту.
Для наглядности рассмотрим все на примере двух задач.
Задача 1.
Даны переменная X(=5), переменная Y (=0). Выполнить для Y присвоение инкремента X.
Сценарий 1: i++ (Постфиксная форма)
Как видно из скриншота, сначала произошло присвоение для Y, а уже потом увеличение X.
Вывод: i++ сначала передает свое значение, а уже потом изменяет его.
Сценарий 2: ++i (Префиксная форма)
Как видно из скриншота, сначала произошло увеличение X, а уже потом присвоение для Y.
Вывод: ++i сначала изменяет свое значение, а уже потом передает.
Идем дальше!
Задача 2.
Даны переменная X(=5), переменная Y (=5), а также переменная результата Z(=0). Выполнить для Z сумму инкрементов X и Y.
Сценарий 1: i++ (Постфиксная форма)
Z = 10, при слагаемых X=Y=6. ИМХО, это не правильно, так что переходим ко второму сценарию.
Сценарий 2: ++i (Префиксная форма)
А тут, как и ожидалось, Z=12.
На примере таких нехитрых (по заверениям далеких от реальных условий) задач мы увидели очевидное отличие в работе постфиксной и префиксной формах инкремента.
Как говорится: "пусть за меня говорят цифры".
Отдельно стоит уточнить и такой важный технический момент - при постфиксной форме инкремента создается вспомогательный объект-копия i, потом увеличивается значение i, и уже после всего этого безобразия далее передается копия.
Что это значит? А черт его знает, я ж Неуч!Но напрягая серое вещество, могу подчеркнуть два момента:
1. Под копию выделяется дополнительная память, т.е. ее будет нужно больше, чем при префиксной форме.
2. При вычислении будет сделано больше операций, а следовательно потребуется больше тактов процессора.
PS2: А еще есть операция присвоения «A += 2», она аналогична записи «A = A + 2», т.е. мы сами выбираем на сколько увеличить переменную (в примере на 2). В этом случае присвоение происходит по второму сценарию.
С уважением, Ваш Неуч.
Циклы, это такая крайне полезная фиговина, дающая возможность упорно двигаться к результату.
PS: Применительно не только к C++.
Цикл FOR - когда вы наверняка сколько раз надо "сделать дело", чтобы "гулять смело".
Что делает: объявляет старт счетчика (в примере и сам "счетчик"), условие его остановки, и шаг с которым он тикает, а уже после выполняет "ВАШИ БЕЗУМНЫЕ КОМАНДЫ".
Его можно использовать, например, для чтения или наполнения массива типа char. Ну или просто заставить эту тупую железяку сосчитать до 1000.
Цикл WHILE - когда вы сначала ставите цель, а потом упорно к ней стремитесь.
Что делает: объявляет условие для остановки и начинает выполнять "ВАШИ БЕЗУМНЫЕ КОМАНДЫ" до тех пор пока это условие не будет достигнут.
Тут надо очень ясно понимать, что пока условие не достигнуто - цикл не окончится. В примере, все упирается в счетчик, и он увеличивается на 1 в конце каждого прогона цикла.
Цикл DO...WHILE - когда вы сначала делаете, потом думаете, и опять делаете, пока не выясняется, что хватит.
Что делает: сначала выполняет "ВАШИ БЕЗУМНЫЕ КОМАНДЫ", потом сверяет их с ожидаемым результатом, и если не сходится, то вновь выполняет "ВАШИ БЕЗУМНЫЕ КОМАНДЫ".
Ключевое отличие, что в отличии от обычного while, тут ваши команды в любом случае выполняться хотя бы раз.
С уважением, Ваш Неуч.
В продолжении вялотекущего судебного разбирательства http://pikabu.ru/story/programmistyi_na_c__samyiy_bolshoy_ra...
Думаю некоторым будет интересно, что же там происходит:)
По итогу 02.06.2016 суд решил признать незаконным решение ФАС.
Из приведенных заключений экспертов следует, что изображение, размещенное обществом на рекламном баннере, не является надписью или текстом на иностранном языке, а представляет собой фрагмент кода компьютерной программы, выполненной на языке программирования С++
С полным текстом решения можно ознакомится тут http://kad.arbitr.ru/PdfDocument/0235635f-01ce-4589-aaff-fe8...
Но антимонопольная служба так просто не сдается и подала апелляцию. Следующее заседание назначено на 03.08.2016.
Кортеж — это упорядоченный набор фиксированной длины. В отличие от массива, кортеж может содержать элементы разных типов.
В языке Python кортеж является стандартным типом данных и позволяет делать вот так:
Но Python использует динамическую типизацию, а в C++ типизация статическая. Как же создать подобную структуру и не сломать систему типов? Используем C++11 и одну и главных особенностей этого стандарта — шаблоны с переменным числом аргументов (variadic templates).
Обычные шаблоны используются в C++ повсеместно, большинству они знакомы. Шаблоны с переменным числом аргументов позволяют передавать произвольное число параметров в шаблон. Вот небольшой пример, демонстрирующий эту возможность языка:
Теперь, собственно, реализация кортежа. Для этого мы воспользуемся рекурсивным наследованием структур. Так выглядит объявление структуры:
Также нам понадобится вспомогательная структура, позволяющая получить тип элемента по его индексу и тип оставшейся части кортежа:
Теперь мы можем написать функцию доступа к элементу по его индексу:
Конечно, сам кортеж и доступ — это хорошо, но мы же хотим его создавать! Для этого сперва реализуем заполнение кортежа.
Теперь легко реализовать и функцию создания кортежа. Почему не конструктор? В нем не работает автоматическое выведение типов, а мы же не хотим писать огромный список параметров ;)
Ну и напоследок демонстрация того, что у нас получилось. Распаковку и групповое присваивание пока не демонстрирую, и так достаточно кода :P
P.S. Не судите строго — это мой первый пост. Возможно тема покажется сложной, я не привожу здесь подробное объяснение. Пишите в комментарии что не понятно, постараюсь ответить.
///////////////////////////////////////////////////
// Начальный курс создания компьютерных игр на C/C++
[0][1][2][2.5][3][4][5][5.5][6][6.2][7][7.2][8][9][9.2][10]
///////////////////////////////////////////////////
// Советы падаванам C++
Всем привет! :]
После первого поста количество подписчиков резко увеличилось в два раза, поэтому я решил не тянуть со вторым постом. :]
Сегодня в рубрике "Советы падаванам C++" у нас будут советы-привычки - те вещи, к которым нужно привыкнуть как можно раньше и использовать каждый день :]