Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Указатели и адреса






     

    Начнем с того, что рассмотрим упрощенную схему организации памяти. Память типичной машины подставляет собой массив последовательно пронумерованных или проадресованных ячеек, с которыми можно работать по отдельности или связными кусками. Применительно к любой машине верны следующие утверждения: один байт может хранить значение типа char, двухбайтовые ячейки могут рассматриваться как целое типа short, а четырехбайтовые - как целые типа long. Указатель - это группа ячеек (как правило, две или четыре), в которых может храниться адрес. Так, если c имеет тип char, а p - указатель на c, то ситуация выглядит следующим образом:

     

    Унарный оператор & выдает адрес объекта, так что инструкция

    p =& c;

    присваивает переменной p адрес ячейки c (говорят, что p указывает на c). Оператор & применяется только к объектам, расположенным в памяти: к переменным и элементам массивов. Его операндом не может быть ни выражение, ни константа, ни регистровая переменная.

    Унарный оператор * есть оператор косвенного доступа. Примененный к указателю он выдает объект, на который данный указатель указывает. Предположим, что x и y имеют тип int, а ip - укаэатель на int. Следующие несколько строк придуманы специально для того, чтобы показать, каким образом объявляются указатели и как используются операторы & и *.

    int х = 1, у = 2, z[10];

    int *ip; /* ip - указатель на int */

     

    ip = & x; /* теперь ip указывает на x */

    y = *ip; /* y теперь равен 1 */

    *ip = 0; /* x теперь равен 0 */

    ip = & z[0]; /* ip теперь указывает на z[0] */

    Объявления x, y и z нам уже знакомы. Объявление указателя ip

    int *ip;

    мы стремились сделать мнемоничным - оно гласит: " выражение *ip имеет тип int ". Синтаксис объявления переменной " подстраивается" под синтаксис выражений, в которых эта переменная может встретиться. Указанный принцип применим и в объявлениях функций. Например, запись

    double *dp, atof (char *);

    означает, что выражения *dp и atof(s) имеют тип double, а аргумент функции atof есть указатель на char.

    Вы, наверное, заметили, что указателю разрешено указывать только на объекты определенного типа. (Существует одно исключение: " указатель на void " может указывать на объекты любого типа, но к такому указателю нельзя применять оператор косвенного доступа. Мы вернемся к этому в параграфе 5.11.)

    Если ip указывает на x целочисленного типа, то *ip можно использовать в любом месте, где допустимо применение x; например,

    *ip = *ip + 10;

    увеличивает *ip на 10.

    Унарные операторы * и & имеют более высокий приоритет, чем арифметические операторы, так что присваивание

    y = *ip + 1;

    берет то, на что указывает ip, и добавляет к нему 1, а результат присваивает переменной y. Аналогично

    *ip += 1;

    увеличивает на единицу то, на что указывает ip; те же действия выполняют

    ++*ip;

    и

    (*iр)++;

    В последней записи скобки необходимы, поскольку если их не будет, увеличится значение самого указателя, а не то, на что он указывает. Это обусловлено тем, что унарные операторы * и ++ имеют одинаковый приоритет и порядок выполнения - справа налево.

    И наконец, так как указатели сами являются переменными, в тексте они могут встречаться и без оператора косвенного доступа. Например, если iq есть другой указатель на int, то

    iq = ip;

    копирует содержимое ip в iq, чтобы ip и iq указывали на один и тот же объект.

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.