Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
questions_inf_progr_2011_Avtosokhranennyy.docx
Скачиваний:
3
Добавлен:
23.09.2019
Размер:
142.27 Кб
Скачать
  1. Указатели. Применение указателей. Объявление указателей. Связь указателей и массивов. Использование указателей в функциях.

      • Указатели: это те же переменные. Разница в том, что вместо того, чтобы хранить определенные данные, они хранят адрес (указатель), где данные могут быть найдены. Концептуально это очень важно. Многие программы и идеи зависят от указателей, как от основы их архитектуры, например, связанные списки (linked lists).

      • Применение указателей: указатели позволяют обойти некоторые ограничения языка (например обратиться к защищенному члену класса) и даже повлиять на систему в целом (например, в DOS программе зная адрес можно обратиться к системным переменным DOS или BIOS).

      • Объявление указателей: Как объявить указатель? Собственно, так же, как и любую другую переменную, но с добавлением звездочки перед именем переменной. Так, например, следующий код создает два указателя, которые указывают на целое число.

int *pNumberOne;

int *pNumberTwo;

Обратили внимание на префикс "p" в обоих именах переменных? Это принятый способ обозначить, что переменная является указателем. Так называемая венгерская нотация. Теперь давайте сделаем так, чтобы указатели на что-нибудь указывали:

pNumberOne = &some_number;

pNumberTwo = &some_other_number;

Знак & (амперсанд) следует читать как "адрес переменной ..." и означает адрес переменной в памяти, который будет возвращен вместо значения самой переменной. Итак, в этом примере pNumberOne установлен и содержит адрес переменной some_number, также pNumberOne указывает на some_number.

      • Связь указателей и массивов:

Обозначение массива представляет собой просто скрытую форму использования указателей. Имя массива определяет адрес его первого элемента, то есть если mas[] — есть массив, то mas = = &mas[0].

Обычно в вычислительной системе единицей адресации является байт; однако тип int использует два байта, тип float — четыре. При прибавлении единицы к указателю компилятор генерирует код: добавить единицу памяти. Для массивов это означает, что осуществляется переход к адресу следующего элемента, а не следующего байта. Отсюда вывод: при описании указателя обязательно указывается тип объекта, на который ссылается указатель, ибо машина должна знать, сколько байтов потребуется для запоминания объекта.

      • Использование указателей в функциях:

Указатель на функцию - переменная, которая содержит адрес некоторой функции. Соответственно, косвенное обращение по этому указателю представляет собой вызов функции.

Определение указателя на функцию имеет вид:

int         (*pf)();                           // без контроля параметров вызова

int         (*pf)(void);                      // без параметров, с контролем по прототипу

int         (*pf)(int, char*);              // с контролем по прототипу

  1. Понятие о структуре. Объявление структур. Операции со структурами.

      • Понятие о структуре: Структура - это совокупность переменных, объединенных под одним именем. С помощью структур удобно размещать в смежных полях связанные между собой элементы информации. Объявление структур создает шаблон, который можно использовать для создания ее объектов, то есть экземпляров этой структуры. Переменные, из которых состоит структура, называются членами. Члены структуры еще называют элементами или полями. 

      • Объявление структур: В объявлении структуры используется ключевое слово struct. Оно сообщает компьютеру, что объявляется (декларируется) структура.    struct addr    {    char name[30];    char street[40];    char city[20];    char state[3];    unsigned long int zip;    };    Общий вид объявления структуры такой:     struct тег {    тип имя-члена;    тип имя-члена;    тип имя-члена;    тип имя-члена;    тип имя-члена;    ...    } переменный-структуры     Причем, тег или переменные-структуры могут быть пропущены, но только не оба одновременно. 

      • Операции со структурами:

Операция принадлежности (точка) используется совместно с именем структуры (или объединения) для задания элемента этой структуры (иди объединения). Если name является именем структуры, а member - элементом, указанным в структурном шаблоне, то name.memberопределяет этот элемент структуры. Операцию принадлежности можно аналогичным образом применять и к объединениям.

Косвенная адресация (определение принадлежности) элемента используется совместно с указателем на структуру (или объединение) для идентификации того или иного элемента этих структур (или объединения). Предположим, что ptrstr является указателем на структуру, a member - элементом, указанным в структурном шаблоне. Тогда ptrstr -> member определяет, что это элемент структуры, на которую ссылается указатель. Операцию косвенной адресации элемента можно применять аналогичным образом и к объединениям.