Указатель ссылается на ячейку памяти, а разыменовать указатель — значит считать значение указываемой ячейки. Значением самого указателя является адрес ячейки памяти. Стандарт языка C не оговаривает форму представления адресов памяти. Это очень важное замечание, поскольку разные архитектуры могут использовать разные модели адресации. Большинство современных архитектур использует линейное адресное пространство или аналогичное ему. Однако даже этот вопрос не оговаривается строго, поскольку адреса могут быть физическими или виртуальными. В некоторых архитектурах используется и вовсе нечисловое представление. Так, Symbolics Lisp Machine оперирует кортежами вида (object, offset) в качестве адресов.
Читать полностью »
Рубрика «указатели» - 2
Указатели в C абстрактнее, чем может показаться
2018-07-24 в 9:34, admin, рубрики: C, c11, Блог компании PVS-Studio, Си, указателиУказатели C как лингвистический парадокс
2018-07-15 в 20:19, admin, рубрики: C, c++, указатели, указательНедавно один знакомый, которого я знаю через совсем не программистские круги, попросил помочь ему с лабораторной по C++. В коде было примерно следующее:
void do_something(MyObj *input[], int count)
{
MyObj **copy = new MyObj*[count];
for (int i = 0; i < count; ++i)
*copy[i] = *input[i];
...
}
Этот случай напомнил о том, что тема указателей является едва ли не основным источником ошибок у изучающих язык студентов, а заодно — своеобразным перевалом, преодоление которого сопряжено с «щелчком» в голове, вызывать который, увы, умеют не все преподаватели. Надеюсь, предложенная ниже лингвистическая аналогия поможет нынешним студентам постигнуть эту концепцию, а их преподавателям или друзьям — донести до них это знание.
Лет десять назад на одном форуме была загадана детская, вроде, загадка:
Для чего еду обеда
Людоедоедоеда
Пригласила на обед
Людоедоедовед?
Я хочу показать, что эта загадка имеет самое прямое отношение к C/C++, поскольку тема указателей легко может быть разобрана по аналогии.Читать полностью »
Как проверить, находится ли значение указателя в заданной области памяти
2017-10-18 в 17:25, admin, рубрики: C, c language, c/c++, c++, Блог компании PVS-Studio, низкоуровневое программирование, Си, си/си++, системное программирование, указателиПусть у нас есть регион/область памяти, заданный с помощью двух переменных, например:
byte* regionStart;
size_t regionSize;
Требуется проверить, находится ли значение указателя в пределах этого диапазона. Возможно, вашим первым побуждением будет написать так:
if (p >= regionStart && p < regionStart + regionSize)
Но гарантирует ли стандарт ожидаемое поведение этого кода?
Читать полностью »
Как в С++ связать классы в единое целое через указатели. Часть первая
2017-04-10 в 12:35, admin, рубрики: c++, классы, связь, указателиНе так давно (меньше полугода) программирование стало моим хобби. Выбрал язык С++ и как в любом учебном процессе, понять нужную информацию бывает иногда очень сложно.
Этот небольшой туториал посвящается таким же как и я, зеленым, не обстрелянным на просторах программирования — новичкам, которые уже смогли понять основную функцию указателя, но все еще слабо понимают, где и как этот указатель можно использовать.
Ну… поехали.
Читать полностью »
Необычные способы применения указателей в C-C++
2017-02-11 в 22:30, admin, рубрики: C, c++, указателиВсем привет. Указатели люди воспринимают по-разному и многие их, мягко говоря, не очень любят. Ну, если они выглядят так:
float(*(*mymegapointer)(double(*)(int)))(int)
То оно и понятно. Но с указателями также можно делать разные прикольные вещи, о некоторых из которых я расскажу.
Читать полностью »
Unsafe в Swift
2016-02-03 в 9:09, admin, рубрики: ios development, iOS разработка, memory, memory leak, pointer, swift, разработка под iOS, указателиСоздатели современных языков программирования всеми силами пытаются увести программистов от прямой работы с указателями и памятью, либо вообще не включая в язык подобные возможности (например, Java) либо маркируя их страшными словами unsafe (C#). Пишущим на swift повезло, этот язык попал во вторую категорию, и хотя это не рекомендуется, а в документации встречаются предупреждения о возможных утечках памяти и прочих страшилках возможность такая есть!
В этой статья я хотел бы рассмотреть работу с указателями в swift, а так же порассуждать для чего это вообще может понадобиться.
Читать полностью »
Нестандартное применение указателей
2015-01-12 в 9:01, admin, рубрики: c++, ненормальное программирование, память, указателиВсем привет. Вечер пятницы, идиотские мысли в голове, начал думать об указателях.
То, о чем я хотел бы написать, возможно знакомо многим. Во всяком случае это самые основы. Но так их никто не использует. Итак, начнем.
Предисловие:
Первая моя мысль была, а что будет если я просто возьму какой-нибудь адрес 0x7fff532c1166 и попробую записать туда «1». Ну, логично предположить, что система как-то нас контролирует и выдаст ошибку сегментирования. Что и произошло.
Читать полностью »
Заземлённые указатели
2013-08-28 в 7:44, admin, рубрики: c++, code review, Cpp, cppcheck, Блог компании PVS-Studio, методологии разработки, обзор кода, разработка, разработка программного обеспечения, С++, указатели, метки: code review, Cpp, cppcheck, методологии разработки, обзор кода, разработка программного обеспечения, С++, указатели
Не так давно, один из сотрудников покинул наш коллектив и присоединился к компании, занимающийся разработкой программного обеспечения, связанного с встраиваемыми системами. Ничего особенного в этом нет, всегда и везде, кто-то уходит, а кто-то приходит. Всё зависит от количества плюшек, удобства и предпочтений. Интересно другое. Человек искренне переживает за состояние кода на новом месте работы, что в результате и вылилось в эту совместную статью. Тяжело, «просто программировать», когда знаешь, что такое статический анализ кода.
Читать полностью »
Что не так с ссылками в С++
2012-09-14 в 11:44, admin, рубрики: c++, null, С++, ссылки, указатели, метки: Null, С++, ссылки, указателиDisclaimer: На данный момент я не располагаю достаточным опытом работы с С++11, поэтому все рассуждения следует рассматривать исключительно в контексте С++03, однако буду рад обсудить в комментариях взаимодействие нововведений С++ с рассмотренными в статье проблемами.
Ссылки в C++ появились чтобы удовлетворить синтаксические потребности механизма перегрузки операторов. В чистом С нет ссылочных типов, вместо этого есть понятие lvalue, которое описывается размытой формулировкой «то, что может стоять слева от оператора присваивания».
// Чистый C
int a;
int foo(int);
a = 7; // тип a - int
5 = 7; // и тип 5 - int
foo(42) = 7; // и тип foo(42) - тоже int
В этом маленьком примере три выражения: переменная a, литерал «5» и вызов функции foo(42) — имеют одинаковый тип — int, но только переменная является lvalue и может стоять слева от оператора присваивания.
С точки зрения С программиста, выражение «foo(42) = 7;» лишено здравого смысла и не должно компилироваться, однако с появлением перегрузки операторов, возникла потребность именно в таких выражениях.
Меченые указатели, или как уместить объект в одном инте. Практика
2012-08-04 в 19:35, admin, рубрики: Cocoa, iOS, objective-c, высокая производительность, ненормальное программирование, перевод, переводы, указатели, метки: Cocoa, iOS, objective-c, ненормальное программирование, перевод, указателиВ первой части мы познакомились с мечеными указателями и тем, как нам создать целый объект, не выделяя под него отдельной памяти.
NSNumber оказался идеальным кандидатом на то, чтобы применить полученые знания на практике—давайте же попробуем написать нашу собственную реализацию этого класса. За основу мы возьмем MANumber—кастомную реализацию NSNumber, и добавим туда поддержку меченых указателей.
Читать полностью »