
- •«Утверждаю»
- •Учебно-методический комплекс
- •Астана 2010 График выполнения и сдачи заданий по дисциплине
- •Карта учебно-методической обеспеченности дисциплины Учебники, учебные пособия
- •Конспект лекционных занятий
- •Тема 1. Введение в программирование на Си. Структура программы. Директивы препроцессора. Типы данных.
- •Основные операции в языке Си.
- •Преобразование типов
- •Тема 2. Управляющие структуры. Выбор вариантов. Структура выбора If, If – Else, логические операции, операция условия, множественный выбор.
- •Тема 3. Управляющие структуры. Структуры повторения While, do – While, For. Управляющие операторы break и continue.
- •Тема 4. Массивы. Разработка программ с использованием одномерных и двумерных массивов.
- •Тема 5. Функции в Си. Создание и использование функций.
- •Тема 6. Классы памяти и разработка программ.
- •Тема 7. Указатели в Си.
- •Тема 8. Использование указателей при обработке одномерных и двумерных массивов.
- •Тема 9. Символы и строки в Си.
- •Функции сравнения из библиотеки обработки строк. Прототипы функций и краткое описание каждой из них приведены в таблице 6.
- •Функции поиска из библиотеки обработки строк. Прототипы функций и краткое описание каждой из них приведены в таблице 7.
- •Другие функции из библиотеки обработки строк. В таблице 8 приведены прототипы и краткое описание остальных функций из библиотеки обработки строк.
- •Ниже приведены примеры программы, использующих функции работы со троками.
- •Тема 11. Структуры данных в Си.
- •Тема 12. Динамические структуры данных.
- •Тема 13. Работа с файлами в Си.
- •Тема 14. Графика в Си.
- •Тема 15. Объектно-ориентированное программирование.
- •Методические рекомендации по выполнению лабораторных заданий
- •Лабораторная работа № 3. Использование операторов цикла при решении задач.
- •Лабораторная работа №4. Разработка программ с использованием одномерных массивов.
- •Лабораторная работа №5. Разработка программ с использованием двумерных массивов.
- •Лабораторная работа № 6. Программирование задач с использованием нескольких функций на языке Си.
- •Лабораторная работа № 8. Программирование задач обработки структур данных.
- •Лабораторная работа № 9. Разработка программ с использованием файловых переменных.
- •Лабораторная работа № 10. Разработка программ с использованием графических функций языка Си.
- •Содержание отчета по выполнению лабораторной работы
- •1 Задание
- •Тема 1. Запись констант, стандартных функций, выражений, операторов присваивания. Запись программ линейных структур алгоритмов.
- •Тема 2. Алгоритмическое описание, запись программ линейных, разветвляющихся.
- •Тема 3. Алгоритмическое описание, запись программ циклических структур алгоритмов.
- •Тема 4. Алгоритмическое описание, составление программ обработки одномерного массива.
- •Тема 5. Алгоритмическое описание, составление программ обработки двумерного массива.
- •Тема 6-7. Составление программ решения задач с использованием функции.
- •Рекомендуемая литература:
- •Тема 8-9. Составление программ решения задач обработки массивов с использованием указателей.
- •Тема 10-11. Программирование задач обработки символьных и стрковых данных.
- •Рекомендуемая литература.
- •Тема 12. Методы сортировки.
- •Тема 13. Составление программ решения задач с использованием структур данных.
- •Тема 14. Составление программ решения задач с использованием файла произвольного доступа.
- •Рекомендуемая литература.
- •Тема 15. Алгоритмизация графических построений.
- •Варианты заданий:
- •Сведения
- •Перечень экзаменационных вопросов по пройденному курсу
- •Глоссарий
Тема 7. Указатели в Си.
Объявление и инициализация переменной-указателя.Указатели представляют собой переменные, значениями которых являются адреса памяти. Указатель содержит адрес переменной, в которой находится конкретное значение. Переменная непосредственно ссылается на значение, а указатель косвенно ссылается на значение. Ссылка на значение через посредство указателя называется косвенной адресацией.
Указатели, как и любые другие переменные, должны быть объявлены, прежде чем они будут использоваться. В операторе
int *countPtr, count;
объявляется переменная countPtrтипаint* (указатель на целочисленное значение). Символ * в объявлении распространяется только наcountPtr. Этот символ означает, что объявляемая переменная является указателем. Можно объявлять указатели, ссылающиеся на объекты любого типа.
Указатели должны быть инициализированы либо при объявлении, либо при помощи оператора присваивания. Указатель может быть инициализирован нулем, макросом NULLили значением адреса. Указатель со значениемNULLне указывает ни на что. Инициализация указателя значением 0 эквивалента инициализации указателя константойNULL, однако использованиеNULLпредпочтительнее. Когда присваивается значение 0, то происходит его преобразование к указателю соответствующего типа. Значение 0 является единственным целым числом, которой может быть присвоено переменной-указателю непосредственно.
Операции с указателями. Язык Си предлагает 5 основных операций, которые можно применить к указателям.
Присваивание. Указателю можно присвоить адрес. Обычно выполняется это действие, используя имя массива или оператор получения адреса (&).
Определения значения. Операция (*) выдает значение, хранящееся в указанной ячейке.
Получение адреса указателя. Подобно любым переменным переменная типа указатель имеет адрес и значение. Операция & сообщает, где находится сам указатель.
Увеличение указателя. Это действие выполняется с помощью обычной операции сложения либо с помощью операции увеличения. Увеличивая указатель, мы перемещаем его на следующий элемент массива.
5. Разность. Можно найти разность двух указателей. Обычно это делается для указателей, ссылающихся на элементы одного и того же массива; чтобы определить, на каком расстоянии друг от друга находятся элементы. Результат имеет тот же тип, что и переменная, содержащая размер массива.
К указателям можно применить арифметические операции, такие как: ++, --, +, +=, -, -= и можно вычислить разность двух указателей.
В качестве примера определим массив int v[10], первый элемент которого будет иметь адрес в памяти, равный 3000. Инициализируем указатель vPtr значением адреса v[0], т.е. значение vPtr равно 3000, любым из следующих операторов
vPtr = v;
vPtr = &v[0];
При прибавлении или вычитании из указателя целого числа значение его увеличивается или уменьшается не на это число, а на произведение числа на размер объекта, на который указатель ссылается.
Размер объекта в байтах зависит от типа объекта. Например, оператор
vPtr += 2;
даст результат 3008 (3000+2*4), если для целого числа отводится в памяти 4 байта. Теперь vPtr будет ссылаться на элемент v[0].
Если бы vPtr был увеличен до значения 3016, которое соответствует адресу элемента массива v[4], то оператор
vPtr -= 4;
вернул бы vPtr к значению 3000, соответствующему началу массива. При увеличении или уменьшении указателя на единицу можно использовать операции инкремента (++) и декремента (--). Каждый из следующих операторов
++vPtr;
vPtr++;
увеличивает значение указателя, который будет ссылаться на следующий элемент массива. Любой из следующих операторов
--vPtr;
vPtr--;
уменьшает значение указателя, который получает при этом доступ к предыдущему элементу массива.
Переменные-указатели могут вычитаться друг из друга. Например, если значение vPtrравно 3000, аv2Ptrсодержит адрес 3008, то в результате выполнения оператора
x = v2Ptr - vPtr;
переменной х будет присвоено число элементов массива, расположенных начиная с адреса vPtrи доv2Ptr; в данном случае это будет значение 2.
Указатель может быть присвоен другому указателю, если оба указателя имеют один и тот же тип. В противном случае надо использовать операцию приведения типа указателя в правой части оператора присваивания к типу указателя в левой части.
Передача параметра по ссылке. В Си для организации вызова по ссылке используются указатели и операция косвенной адресации. Если вызывается функция, аргументы которой должны изменяться, то в этом случае ей передаются адреса аргументов. Обычно для этой цели применяется операция взятия адреса (&) к переменной, значение которой будет изменяться. Когда адрес переменной передан функции, то для изменения ее значения может быть использована операция косвенной адресации (*). В следующей программе приведено использование передачи параметра по ссылке.
#include <stdio.h>
main()
{ int x=5, y=10;
printf(“x=%d y=%d\n”, x, y);
change(&x,&y); /* передача адресов функции */
printf(“x=%d y=%d\n”, x, y); }
change (int *u, int *v)
{ inttemp;
temp=*u; /*tempприсваивается значение, на которое указываетu*/
*u=*v;
*v=temp; }
Результат программы:
x=5y=10
x=10y=5
Данная функция изменяет значения переменных xиy. Путем передачи функции адресов переменных х и у мы предоставили ей возможность доступа к ним. Используя указатели и операцию (*), функция смогла извлечь величины, помещенные в соответствующие ячейки памяти, и менять их местами.
Основная литература: 1осн[273-292],2осн[273-276]
Дополнительная литература:9доп[135-147]
Контрольные вопросы:
1. Назовите операции для работы с указателями?
2. На какое число увеличивается значение указателя при прибавлении из указателя целого числа?
3. Приведите пример инициализации переменной-указателя?
4. Приведите пример объявления переменной-указателя?
5. Какая операция используется для организации вызова по ссылке?