- •1.Базовые элементы языка с. Алфавит и словарь языка
- •2. Основные типы данных. Классификация их типов. Модификация базовых типов.
- •3. Константы.
- •4. Переменные.
- •5. Структура с - программы. Понятие локальных и глобальных переменных. Функция main().Директивы препроцессора (#include и #define). Комментарии.
- •6. Операции языка с. Арифметические, логические операции. Поразрядные операции.
- •7. Операции языка с. Операция присваивания и отношения. Операция определения размера. Оператор последовательного вычисления.
- •8. Операции языка с. Условная операция. Операция (), операция [].
- •9. Приоритет операций и порядок вычислений.
- •11. Ввод-вывод символов
- •12. Форматированный ввод-вывод. Модификаторы формата. Спецификаторы преобразования. Подавление ввода.
- •13. Операторы языка с. Условные операторы (if и switch).
- •16. Одномерные массивы.
- •17. Строковый литерал. Чтение и запись строк.
- •18. Двухмерные массивы. Массивы строк.
- •20.Способы доступа к элементам массива
- •21. Понятие указателя. Инициализация указателей.
- •22. Указательные переменные. Операции получения адреса (&) и раскрытия ссылки(*).
- •23. Указательные выражения. Адресная арифметика.
- •Динамическое выделение памяти для массивов.
- •Функции. Определения функций. Оператор return.
- •Тип_результата id_функции (список);
- •Функции. Прототипы функций.
- •Тип_результата id_функции (список);
- •Функции. Вызов функций: вызов по значению и по ссылке.
- •Тип_результата id_функции (список);
- •Передача массива в функцию.
- •Классы памяти. Область видимости.
- •Аргументы функции main(): argv и argc.
- •Вызов библиотечных функций.
- •Директива препроцессора #define: создание макрофункций с помощью директивы #define.
- •Директивы условной компиляции #if, #else, #elif, #endif, #ifdef, #ifndef.
- •Понятие структуры. Доступ к членам структуры.
- •Присваивание структур.
- •Id_структуры . Id_поля
- •Передача членов структур функциям. Передача целых структур функциям.
- •Указатели на структуры. Средство typedef.
- •Понятия объединения и перечисления. Битовые поля.
- •Основы файловой системы. Стандартные потоки. Указатель файла. Открытие файла. Закрытие файла.
22. Указательные переменные. Операции получения адреса (&) и раскрытия ссылки(*).
Указательные переменные
Указатель – это переменная, которая содержит адрес некоторого объекта.
Указатели чаще всего используются при работе с динамической памятью. Доступ к выделенным участкам динамической памяти, называемых динамическими переменными, производится только через указатель.
Время жизни динамических переменных – от точки создания до конца программы или до явного освобождения памяти.
В С различают 3 вида указателей:
– указатели на объект;
– указатели на функцию;
– указатели на void, отличающиеся свойствами и набором допустимых операций.
Указатель на функцию содержит адрес в сегменте кода, адрес, по которому передается управление при вызове функции. Они используются для косвенного вызова функции (не через ее имя, а через обращение переменной, хранящей ее адрес), а также для передачи имени функции в другую функцию в качестве
параметра.
тип(*имя)(список типов аргументов);
Пример:
int (*fun)(double, double);
задает указатель с именем fun на функцию, возвращающую значение типа int и имеющую 2 аргумента типа double.
Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа.
тип *имя;
В этом объявлении тип – некоторый тип языка С, определяющий тип объекта, на который указывает указатель (адрес которого содержит). * – следующая за ней переменная является указателем. Она относится непосредственно к имени, поэтому для того, чтобы объявить несколько указателей, требуется вставить ее перед именем каждого из них.
Пример:
int *a, b, *c;
Описываются 2 указателя на целое с именами а и с, а также целая переменная b.
Пример:
…
void *p1; // объявление указателя на тип void
float f, *p2; // объявление указателя на тип float (p2) и переменной того же типа (f)
p2 = &f; // указатель p2 теперь указывает на f (они имеют один и тот же адрес)
p1 = p2; // присваивание указателю void указателя типа float
p2 = (float *)p1; /* обратное присваивание: указателю p2 присваивается указатель p1,
предварительно преобразовав p1 к типу float */
Операции получения адреса (&) и раскрытия ссылки (*)
С указателями связаны 2 специальные операции: & и *. Обе эти операции являются унарными, т.е. имеют один операнд, перед которыи они ставятся.
Операция & соответствует операции "взять адрес"; операция * соответствует словам "значение, расположенное по указанному адресу".
В объявлении переменной, являющейся указателем, очень важен базовый тип. Компилятор знает, сколько байт памяти занимает переменная, на которую указывает данный указатель из базового типа указателей. Если указатель имеет базовый тип int, то переменная занимает 2 байта, char – 1 байт и т.д.
Пример:
// работа с указателями
{
float x = 10.1, y; // объявление с инициализацией x и y
float *point; // объявление указателя point на тип float
point = &x; // применение операции взятия адреса; теперь указатель point указывает на x
y = *point; /* применение операции взятия значения, расположенному по адресу, на который
указывает point; теперь y содержит значение x (т.к. point указывал на x */
printf ("x = %d", x , "y = %d", y); // вывод значения x и y (они одинаковы)
++ *point; /* увеличение на единицу значения, расположенного по адресу, на который
указывает указатель point */
printf ("\n x = %d", x, "y = %d", y); /* теперь значение x увеличено на единицу, а y –
без изменения */
y = 1+ *point*y; // сумма единицы и значения указателя point * на значение переменной y
printf("\n x = %d", x, "y = %d", y); // вывод значений x и y
getch();
}